处理Java中列表的优雅方法有哪些?(Python与Java)

7 投票
5 回答
1508 浏览
提问于 2025-04-16 09:47

我很喜欢在Python中处理列表的方式。用递归来解决问题看起来既简单又干净。比如说,获取列表中所有元素的排列组合,在Python中写起来就像这样:

def permutation_recursion(numbers,sol):
    if not numbers:
        print "this is a permutation", sol
    for i in range(len(numbers)):
        permutation_recursion(numbers[:i] + numbers[i+1:], sol + [numbers[i]])

def get_permutations(numbers):
    permutation_recursion(numbers,list())

if __name__ == "__main__":
    get_permutations([1,2,3])

我还喜欢通过一些简单的操作来得到修改后的新列表,比如用 numbers[:i] + numbers[i+1:] 或者 sol + [numbers[i]]

但是如果我在Java中想要写出完全一样的代码,就会变得复杂很多:

import java.util.ArrayList;
import java.util.Arrays;

class rec {
    static void permutation_recursion(ArrayList<Integer> numbers, ArrayList<Integer> sol) {
       if (numbers.size() == 0)
            System.out.println("permutation="+Arrays.toString(sol.toArray()));
       for(int i=0;i<numbers.size();i++) {
             int n = numbers.get(i);

             ArrayList<Integer> remaining = new ArrayList<Integer>(numbers);
             remaining.remove(i);

             ArrayList<Integer> sol_rec = new ArrayList<Integer>(sol);
             sol_rec.add(n);

             permutation_recursion(remaining,sol_rec);
       }
    }
    static void get_permutation(ArrayList<Integer> numbers) {
        permutation_recursion(numbers,new ArrayList<Integer>());
    }
    public static void main(String args[]) {
        Integer[] numbers = {1,2,3};
        get_permutation(new ArrayList<Integer>(Arrays.asList(numbers)));
    }
}

为了实现同样的递归,我需要这样做:

ArrayList<Integer> remaining = new ArrayList<Integer>(numbers);
remaining.remove(i);

ArrayList<Integer> sol_rec = new ArrayList<Integer>(sol);
sol_rec.add(n);

这看起来相当麻烦,而且对于更复杂的解决方案来说,情况会更糟。就像在这个例子中。

所以我想问的是……在Java的API中有没有什么内置的操作符或辅助函数,可以让这个解决方案变得更“像Python”呢?

5 个回答

1

Apache Commons可以解决很多这类问题。你可以看看ArrayUtils,它可以帮助你进行数组切片。相比于一些脚本语言,Java在语法上没有那么多方便的简化写法,这有很多原因。

2

你可以使用 clone() 这个函数来复制列表,这样你就能得到一个浅拷贝。这样你就不用自己创建一个新的对象,而是可以直接使用这个复制的列表。

ArrayList<Integer> remaining = remaining.clone().remove(i);

除此之外,Java 对于列表没有其他类似的操作符。

8

不行。

但这就是为什么马丁·奥德斯基创造了Scala。他甚至说过,他创建Scala的一个目标就是希望它能成为Java世界里的Python。Scala可以编译成Java字节码,并且可以很方便地和Java编译的类进行互操作。

如果这不是一个选择,你可以看看Commons Collection Library

撰写回答