列表清单

时间:2010-06-23 14:55:46

标签: java list

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

5 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分:12)

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

在Java中你会这样:

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

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

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

或者,迭代一切:

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

答案 2 :(得分:5)

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

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

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

  3. 更好的是,您可以封装该地图并使用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);
            }
        }
    }
    

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

答案 3 :(得分:3)

虽然你可以构建一个List&lt; List&lt; List&lt; whatever&gt;&gt;&gt;在Java中,我不禁想知道,你为什么要这样做?并不是说这是你问题的最佳解决方案是不可思议的,但哇,就像为什么?

我想我可以想象像

这样的东西
public class Employee ...
List<Employee> store; // all the employees in a store
List<List<Employee>> city; // all the store lists for a city
List<List<List<Employee>>> nation; // all the store lists for the nation

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

答案 4 :(得分:2)

一个综合示例,显示带有集合和泛型的List-of-List(Java 1.5 +)

// declare the list of lists
List<List<String>> listOfListOfStrings = new ArrayList<List<String>>();

// populate
List<String> listOfStrings = new ArrayList<String>(); // one inner list
listOfStrings.add("one-one");
listOfStrings.add("one-two");
listOfListOfStrings.add(listOfStrings);

listOfStrings = new ArrayList<String>(); // 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