【问题标题】:Java - multidimensional array of vectors of generic typeJava - 泛型向量的多维数组
【发布时间】:2011-04-29 08:03:24
【问题描述】:

想象一下,如果你愿意,一个 10x10x10 的立方体是由 1x1x1 的砖块制成的。每块砖都必须可以通过 x,y,z 坐标访问。对于每块砖,我还需要存储拥有该“砖”的人的姓名列表。

由于效率是绝对必要的,我想出了以下想法 - 一个 3d 向量数组。 注意-我创建了一个存储名称和其他信息(称为人)的类

//declaration
    protected Vector<person>[][][] position;

我想我必须为指针位置分配内存。这个我试过了

position = new Vector<person>[10][10][10]; 

但我收到一个错误“无法创建 Vector 的通用数组”我只熟悉 C++,而 Java 对我来说是新手。我了解 java 不喜欢用泛型类型声明数组?有谁知道我该如何解决这个问题?

干杯

【问题讨论】:

    标签: java


    【解决方案1】:

    如果您确实想使用 List 结构而不是数组,这应该足以让您入门。这是基于@FrustratedWithFormsDes 所说的,但我包含了初始化代码,因为很难获得正确的语法。

    public class Person {
    }
    
    class PeopleStorage {
    
        ArrayList<ArrayList<ArrayList<Person>>> data;
    
        public PeopleStorage(int size) {
    
        this.data = new ArrayList<ArrayList<ArrayList<Person>>>(size);
    
        for (int i = 0; i < size; i++) {
            ArrayList<ArrayList<Person>> inner = new ArrayList<ArrayList<Person>>(
                size);
            data.add(inner);
            for (int j = 0; j < size; j++) {
            ArrayList<Person> inner2 = new ArrayList<Person>(size);
            inner.add(inner2);
            for (int k = 0; k < size; k++) {
                inner2.add(new Person());
            }
            }
        }
        }
    
         public Person get(int index1, int index2, int index3)
         {
          //check indices against size, throw IllegalArgumentException here
         return data.get(index1).get(index2).get(index3);
         }
    
         public void set(Person person, int index1, int index2, int index3)
         {
         //check indices against size, throw IllegalArgumentException here
         data.get(index1).get(index2).set(index3, person);
         }
    }
    

    【讨论】:

      【解决方案2】:

      注意:这更多是对为什么泛型数组在 Java 中不起作用的解释,而不是对您的实际问题的回答。

      Effective Java 2nd Edition 在第 5 章的第 119 页 (PDF) 处理了泛型数组。

      为什么创建泛型是非法的 大批?因为它不是类型安全的。如果 这是合法的,由 编译器以其他方式正确 程序可能在运行时失败 ClassCastException。这个会 违反根本保障 由泛型类型系统提供。

      这是因为 Java 泛型仅在编译时具有类型并插入适当的强制转换,因此特定操作在运行时起作用。

      解决这个问题最简单的方法可能是Ed.C provided

      【讨论】:

        【解决方案3】:

        我想你会想要使用ArrayList 而不是向量。我对此有点生疏,但据我回忆,混合数组和通用容器并不是一个好主意。

        你可以试试这个:

        position = new ArrayList(10)<ArrayList(10)<ArrayList(10)<Person>>; 
        

        但它读起来相当难看。访问数据是这样的:

        person = position.get(1).get(3).get(6); //get someone at x=1, y=3, z=6
        

        请注意,我现在没有机会编译它并查看它是否真的有效,因此您可能需要阅读 ArrayList 上的文档,但我认为这是您可以选择的方向...


        更新:jhominal 指出了一些我忘记的news,我手头没有 Java 编译器来验证这一点,但如果你尝试这个解决方案,也看看他说的。

        【讨论】:

        • 我曾短暂尝试过使用 ArrayList。但是,我认为我对泛型类型的投诉有同样的问题。不过,我会阅读该链接,谢谢。
        • 你说得对,混合数组和泛型是不可能的,但是 ArrayList 与 Vector 并不重要。
        • ArrayList&lt;ArrayList&lt;ArrayList&lt;Person&gt;&gt;&gt; cube = new ArrayList&lt;ArrayList&lt;ArrayList&lt;Person&gt;&gt;&gt;();
        • @shoebox639:感谢您的测试! :)
        • 您为创建数组而编写的代码将不起作用。你需要先调用new ArrayList&lt;List&lt;List&lt;Person&gt;&gt;&gt;();,然后用new ArrayList&lt;List&lt;Person&gt;&gt;();等填充每个索引。
        【解决方案4】:

        我也会选择 Ed.C 的对象答案,但这似乎可行:

        @SuppressWarnings("unchecked")
        protected Vector<Person>[][][] position = new Vector[10][10][10];
        

        即,您跳过右侧的菱形。

        【讨论】:

          【解决方案5】:

          没必要把事情弄得那么复杂!您知道数组的大小 (10:10:10),因此无需为砖块寻找向量或其他东西。尝试使用对象数组:

          类砖{ 公共砖(int x,int y,int z){ 这个.x=x; 这个.y=y; 这个.z=z; 所有者 = 新的 ArrayList (); } 列出 所有者; 整数 x, y, z; //每块砖都“知道”它的位置——你可能不需要它 }

          创建数组的代码:

          公共类主{ ...... 砖立方体[][][] = 新砖[10][10][10]; 对于 (int x=0; x

          牢记 OOP - 它让事情变得更容易!

          TODO:添加 getter/setter

          【讨论】:

          • 编辑:我刚刚修复了 HTML 实体的一些错误
          【解决方案6】:

          您尝试做的事情在 java 中是不可能的,因为没有运算符重载(就像在 C++ 中一样)。简而言之,Java 中的 [] 运算符仅为数组定义,不能重载。因此,访问 Vector/ArrayList 中的元素的唯一方法是通过 get() 方法(或通过 Iterator 或其他几种方法,但你明白了)。类似地,您不能以这种方式定义多维 ArrayList。你应该做的是 ArrayList&lt;ArrayList&lt;ArrayList&lt;Person&gt;&gt;&gt; people = new ArrayList&lt;ArrayList&lt;ArrayList&lt;Person&gt;&gt;&gt;() 然后去用嵌套循环或任何你想要的初始化所有内部数组。 它看起来有点难看,并且由于 ArrayList/Vector 是一个动态集合,例如在第一个数组中添加一个新元素将需要您初始化两个嵌套数组。因此,在设计方面,您可能会更好地为该类编写某种形式的包装器,以便在那里隔离该逻辑。

          Java 中 ArrayList 和 Vector 的区别在于,vector 是同步的(因此速度较慢)并且处于默认增长模式(Vector 的大小翻倍,而 ArrayList 增长了 50%)。否则,它们在功能和操作复杂性方面几乎相同。

          【讨论】:

            猜你喜欢
            • 2011-07-23
            • 2017-08-21
            • 1970-01-01
            • 2012-01-06
            • 2011-09-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-18
            相关资源
            最近更新 更多