Vector.clear()在多维向量中

时间:2014-06-30 22:33:48

标签: java eclipse vector

我正在制作一个程序来读取和转换文本文件到eclipse中自定义对象的2D矢量,但似乎每当我在1D矢量上调用Vector.clear()时,它也会删除2D中的相应元素向量。为什么会发生这种情况,我该如何解决这个问题?另外,请记住我是java的初学者。

    public Vector<Vector<gridObject>> copyToVector(Scanner s){
    //main instantiation
    Scanner lineReader = null;
    gridObject objectInstance = new gridObject();
    objectInstance.w = 10;
    objectInstance.h = 10;
    Vector<gridObject> objectVector = new Vector<gridObject>();
    Vector<Vector<gridObject>> objectMatrix = new Vector<Vector<gridObject>>();
    int rowNumber = 0;
    int columnNumber = 0;
    //reads next line break
    while(s.hasNextLine()){
        lineReader = new Scanner(s.nextLine());
        rowNumber++;
        //reads next character
        while(lineReader.hasNext()){
            columnNumber++;
            //decides what object the character represents
            switch(lineReader.next()){
                case "0":
                    objectInstance.x = 10*(columnNumber-1);
                    objectInstance.y = 10*(rowNumber - 1);
                    objectInstance.id = 0;
                    break;
                case "1":
                    objectInstance.x = 10*(columnNumber-1);
                    objectInstance.y = 10*(rowNumber - 1);
                    objectInstance.id = 1;
                    break;
                default:
                    objectInstance.x = 10*(columnNumber-1);
                    objectInstance.y = 10*(rowNumber - 1);
                    objectInstance.id = -1;
                    break;
            }
            objectVector.addElement(objectInstance);
        }
        objectMatrix.addElement(objectVector);
        System.out.println(objectMatrix.elementAt(0).size());
        objectVector.clear();
        System.out.println(objectMatrix.elementAt(0).size());
        columnNumber = 0;
    }
    lineReader.close();
    return objectMatrix;
}

此函数正在读取的文件是一个由0组成的简单txt文件

    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0

输出是这样的:

    10
    0
    10
    0
    10
    0

为什么会这样?

3 个答案:

答案 0 :(得分:0)

问题在于:

objectMatrix.addElement(objectVector);
System.out.println(objectMatrix.elementAt(0).size());
objectVector.clear();

请注意,objectVector参考。因此,当您致电objectMatrix.addElement(objectVector);时,您将参考存储到objectVector objectMatrix。该参考指向的实际对象未以任何方式被复制或更改。

因此,当您致电objectVector.clear()时,您会清除objectVector指向的对象,这也恰好是您最近添加到objectMatrix的参考对象。

要解决此问题,请为new Vector()循环的每次迭代分配while,或将objectVector()的内容复制到new Vector(),然后再将其添加到{{1} }}

另外,您可能应该使用objectMatrix代替ArrayListVector是一个遗留类,这些日子几乎不需要使用。

答案 1 :(得分:0)

您正在将objectVector添加到objectMatrix中 - 很好。 然后你正在清除objectVector,所以复制objectMatrix现在已经被清除了 - 不是很好。

为什么不在第一个while循环中实例化objectVector。例如像这样:

lineReader = new Scanner(s.nextLine());
Vector<gridObject> objectVector = new Vector<gridObject>();

然后你不需要清除它。

答案 2 :(得分:0)

替换

objectVector.clear() 

objectVector = new Vector<gridObject>();

由于您已经将objectVector添加到objectMatrix,因此在同一实例上调用clear也将在矩阵内清除。需要新的参考来放置新值。

也紧接在以下一行

之后
objectVector.addElement(objectInstance);

添加新行

objectInstance = new gridObject();
每次在程序中,对象值的objectInstance应该不同,否则它指向相同的引用。

建议: 1.替换Vector&lt;&gt;与列表&lt;&gt;哪个性能更好。 2.在java中,类名以大写的第一个字母开头。请将gridObject更改为GridObject。

此致