列表清单
我是Java的新手,我需要列出一系列列表。 我可以在python中做到这一点,因为列表的元素可以是一个列表,因此在嵌入列表list[0]
将引用一个列表, list[0][0]
将引用嵌入列表的zeroeth元素。 有没有简单的方法在java中实现这种行为?
所有其他答案在技术上都是正确的,但恕我直言,如果您实施一个粗略的列表列表列表,您不会在正确的抽象级别处理您的数据。 例如,我很确定列表列表在您的业务领域中已经意味着“某些东西”。 将此“东西”封装在另一个对象中,这样您就可以只使用List >>。
正如马里奥所说,你可能需要进一步抽象出你的数据。 但是,以下将满足您的需求。
在Java中你会这样:
List>> listOfListsOfLists =new ArrayList>>();
然后,要访问这些项目,您将使用:
listOfListsOfLists.get(a).get(b).get(c);
或者,迭代一切:
for (List> list2: listOfListsOfLists) { for (List
由于所有这些答案都让我成为barf,我可以添加你的建议吗?
-
创建数据类型以表达您的数据,同时封装结构的详细信息,或至少
-
创建一个包装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