微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有更优雅的方式来处理Java中的列表? (Python VS Java)

我喜欢用 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])

我喜欢通过这样的方式简单地获取修改列表的新实例的方式
数字[:i]数字[i 1:]或sol [数字[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,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);

这对于更复杂的解决方案来说非常难看并且变得更糟.就像在this example

所以我的问题是…… Java API中是否有任何内置运算符或辅助函数可以使这个解决方案更“Pythonic”?

解决方法

没有.

但这就是为什么Martin Odersky创造了Scala.他甚至说他对Scala的目标之一就是它是Java世界的Python. Scala编译为Java字节码,并且可以轻松地与Java编译类进行交互.

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

原文地址:https://www.jb51.cc/java/129312.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐