列表清单

15 java list

我是Java的新手,我需要列出一系列列表.我可以在python中完成它,因为列表的元素可以是一个列表,因此在嵌入列表list[0]中将引用一个列表并list[0][0]引用嵌入列表的zeroeth元素.有没有简单的方法在java中实现这种行为?

Mar*_*sco 27

所有其他答案在技术上都是正确的,但恕我直言,如果您实施一个粗略的列表列表列表,您不会在正确的抽象级别处理您的数据.例如,我很确定列表列表在您的业务领域中已经意味着"某些东西".将此"东西"封装在另一个对象中,这样您就可以使用List <Something>而不是难以使用和维护List <List <List <Object >>>.

  • 在我的职业生涯中,我多次听到这种理由:"我将从列表清单开始,我会看到会发生什么,然后我会重构它." 这是一个一厢情愿的想法,或者更可能只是一个谎言,最后的结果是糟糕的列表清单将永远存在于你的代码中.如果您已经知道有更好的方法来编写代码(并且您似乎同意您可以做得更好),为什么不以最佳方式开始? (8认同)
  • 在某些语言中(诚然,通常不是Java,由于其冗长的语法),使用list-of-list列表对于原型设计来说非常常见.对于探索性编程,当您没有在任何地方嵌入显式名称时,可以更容易地进行更改.一旦你正在编写一个企业网络应用程序,当然,你需要"正确的抽象级别"和"你的业务领域",但如果你正在编写一个程序来做"我不知道还有什么,但让我们看看这个去吧,名单很棒.Linux内核也没有完全考虑,或者甚至作为操作系统内核. (2认同)

jjn*_*guy 12

正如马里奥所说,你可能需要进一步抽象出你的数据.但是,以下将满足您的需求.

在Java中你会这样:

List<List<List<Object>>> listOfListsOfLists =new ArrayList<List<List<Object>>>();
Run Code Online (Sandbox Code Playgroud)

然后要访问这些项目,您将使用:

listOfListsOfLists.get(a).get(b).get(c);
Run Code Online (Sandbox Code Playgroud)

或者,迭代所有内容:

for (List<List<Object>> list2: listOfListsOfLists) {
    for (List<Object> list1: list2) {
        for (Object o: list1) {
            // use `o`
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

由于所有这些答案都让我成为barf,我可以添加你的建议吗?

  1. 创建数据类型以表达您的数据,同时封装结构的细节,或至少

  2. 创建一个包装int []的键类型(但正确覆盖equals和hashCode)并使用HashMap代替?无论如何,您的整个三维结构通常很少被填满.

更好的是,您可以封装该映射并使用varargs进行干净访问.

public class NDimensionalArray<V> {
    private final int dimensions;
    private final Map<Key, V> values = new HashMap<Key, V>();

    private NDimensionalArray(int dimensions) {
        this.dimensions = dimensions;
    }

    public V get(int... indices) {
        checkIndices(indices);
        return values.get(new Key(indices));
    }

    public void set(V value, int... indices) {
        checkIndices(indices);
        values.put(new Key(indices), value);
    }

    private void checkIndices(int[] indices) {
        if ( indices.length != dimensions ) {
            throw new IllegalArgumentException();
        }
    }

    private static final class Key {
        private final int[] indices;

        private Key(int[] indices) {
            this.indices = indices;
        }

        @Override
        public int hashCode() {
            return Arrays.hashCode(indices);
        }

        @Override
        public boolean equals(Object obj) {
            return Arrays.equals(indices, ((Key)obj).indices);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果人们有已建立的集合库的例子已经做过这种事情,请告诉我,我会添加链接.