列表清单

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

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

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

在Java中你会这样:

 List>> listOfListsOfLists =new ArrayList>>(); 

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

 listOfListsOfLists.get(a).get(b).get(c); 

或者,迭代一切:

 for (List> list2: listOfListsOfLists) { for (List list1: list2) { for (Object o: list1) { // use `o` } } } 

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

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

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

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

 public class NDimensionalArray { private final int dimensions; private final Map values = new HashMap(); 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); } } } 

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

虽然您可以在Java中构建List >>,但我不禁要问,为什么要这样做呢? 并不是说这是你问题的最佳解决方案是不可思议的,但哇,为什么呢?

我想我可以想象类似的东西

 public class Employee ... List store; // all the employees in a store List> city; // all the store lists for a city List>> nation; // all the store lists for the nation 

但你真的想以这种方式处理吗? 我不知道,这取决于你需要做什么。

一个包含集合和generics的List-of-List的综合示例(Java 1.5+)

 // declare the list of lists List> listOfListOfStrings = new ArrayList>(); // populate List listOfStrings = new ArrayList(); // one inner list listOfStrings.add("one-one"); listOfStrings.add("one-two"); listOfListOfStrings.add(listOfStrings); listOfStrings = new ArrayList(); // and another one listOfStrings.add("two-one"); listOfStrings.add("two-two"); listOfListOfStrings.add(listOfStrings); // access String oneOne = listOfListOfStrings.get(0).get(0); // first element of first inner list String twoTwo = listOfListOfStrings.get(1).get(1); // second element of second inner list