Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 清单清单_Java_List - Fatal编程技术网

Java 清单清单

Java 清单清单,java,list,Java,List,我是Java新手,我需要列出一个列表。我可以在python中这样做,因为列表的元素可以是列表,所以在嵌入式列表中,list[0]将引用列表,list[0][0]将引用嵌入式列表的第零个元素。有什么简单的方法可以在java中实现这种行为吗?如前所述,您可能需要进一步抽象数据。但是,以下内容将满足您的需要 在Java中,您可以这样做: List<List<List<Object>>> listOfListsOfLists =new ArrayList<Lis

我是Java新手,我需要列出一个列表。我可以在python中这样做,因为列表的元素可以是列表,所以在嵌入式列表中,
list[0]
将引用列表,
list[0][0]
将引用嵌入式列表的第零个元素。有什么简单的方法可以在java中实现这种行为吗?

如前所述,您可能需要进一步抽象数据。但是,以下内容将满足您的需要

在Java中,您可以这样做:

List<List<List<Object>>> listOfListsOfLists =new ArrayList<List<List<Object>>>();
或者,迭代所有内容:

for (List<List<Object>> list2: listOfListsOfLists) {
    for (List<Object> list1: list2) {
        for (Object o: list1) {
            // use `o`
        }
    }
}
for(列表2:listOfListsOfLists){
对于(列表1:列表2){
for(对象o:list1){
//使用'o'`
}
}
}

既然所有这些答案都让我呕吐,我能补充一点建议吗

  • 创建一个数据类型来表示数据,同时封装结构的详细信息,或者至少

  • 创建一个封装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);
            }
        }
    }
    
    公共类NDimensionalArray{
    私有最终整数维;
    私有最终映射值=新HashMap();
    专用NDimensionalArray(整数维){
    这一点。尺寸=尺寸;
    }
    公共V get(int…索引){
    检查指数(指数);
    返回值.get(新键(索引));
    }
    公共无效集(V值,整数…索引){
    检查指数(指数);
    值。put(新键(索引),值);
    }
    私有void检查索引(int[]索引){
    if(index.length!=尺寸){
    抛出新的IllegalArgumentException();
    }
    }
    私有静态最终类密钥{
    私人最终综合指数;
    私钥(int[]索引){
    该指数=指数;
    }
    @凌驾
    公共int hashCode(){
    返回数组。哈希代码(索引);
    }
    @凌驾
    公共布尔等于(对象obj){
    返回数组.equals(索引,((键)obj).index);
    }
    }
    }
    

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

    一个显示集合和泛型列表的综合示例(Java 1.5+)

    //声明列表的列表
    List ListofListofString=new ArrayList();
    //填充
    List listofstring=new ArrayList();//一个内部列表
    添加(“一个”);
    添加(“一两”);
    添加(listOfStrings);
    listOfStrings=newarraylist();//还有一个
    添加(“两个一”);
    添加(“两个两个”);
    添加(listOfStrings);
    //通路
    String one=listofListofString.get(0.get(0);//第一个内部列表的第一个元素
    String twoo=listofListofString.get(1).get(1);//第二个内部列表的第二个元素
    
    所有其他答案在技术上都是正确的,但是如果你实现了一个粗略的列表列表,你就没有在正确的抽象层次上处理数据。例如,我非常确定列表列表在您的业务领域中已经意味着“某物”。将这个“某物”封装到另一个对象中,这样您就可以拥有一个列表,而不是一个难以使用和维护的列表。

    虽然您确实可以用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
    
    公共类员工。。。
    列表存储;//商店里所有的员工
    列出城市;//一个城市的所有商店名单
    国家名单;//全国所有的商店名单
    

    但你真的想这样处理吗?我不知道,这取决于您需要如何处理它。

    要么我遗漏了什么,要么这里有一个缺陷-数组哈希代码基于标识,而不是数组中的值-您的映射键无法按预期工作?如果值范围允许非冲突哈希代码(即索引0..1000和哈希代码=1000000*A[2]+1000*A[1]+A[0]),则基于这些值定义哈希代码的dataholder类将起作用@rsp:谢谢,你完全正确。有点太匆忙了。现在已经修好了(尽管我还没有测试)。只要正确实现equals,hashcode就不必是非冲突的(毕竟,无限空间类的所有hashcode最终都会冲突)。在某些语言中(无可否认,由于其冗长的语法,不典型的Java),使用列表列表列表对于原型化来说是非常常见的。对于探索性编程,当您没有在任何地方嵌入显式名称时,进行更改会容易得多。一旦你在编写EnterpriseyWeb应用程序,当然,你需要“正确的抽象级别”和“你的业务领域”,但如果你在编写一个程序来完成“我还不知道该做什么,但让我们看看这会发生什么”,列表是很好的。Linux内核一开始也不是完美的,甚至不是作为一个操作系统内核。在我的工作生涯中,我无数次听到这样的理由:“我将从一个列表列表开始,我将看看会发生什么,然后我将重构它。”这在bast案例中是一厢情愿的想法,或者更可能只是一个谎言,其最终结果是可怕的列表列表将永远保留在代码中。如果您已经知道有更好的方法来编写代码(而且您似乎同意可以做得更好),为什么不从最好的方法开始呢?您只需要花几分钟的时间来封装。。。就这么做吧,要优雅!编译器“认为”
    add
    是包
    listOfStrings
    中的一个类(这是显而易见的)
    // 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
    
    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