簡體   English   中英

多維向量中的Vector.clear()

[英]Vector.clear() in Multidimensional Vectors

我正在編寫一個程序來在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

為什么會這樣?

問題在這里:

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

請記住, objectVector是一個引用 因此,當您調用objectMatrix.addElement(objectVector); ,您要objectMatrix objectVector引用存儲到objectMatrix 該引用指向的實際對象尚未以任何方式被復制或更改。

因此,當您調用objectVector.clear() ,將清除objectVector指向的對象,該對象也恰好是您最近添加到objectMatrix

為了解決這個問題,可以為while循環的每次迭代分配一個new Vector() ,或者將objectVector()的內容復制到new Vector()然后再將其添加到objectMatrix

附帶說明一下,您可能應該使用ArrayList而不是Vector Vector是一個遺留類,這些天幾乎不再需要使用。

您正在將objectVector添加到objectMatrix-很好。 然后,您正在清除objectVector,因此也已清除了副本objectMatrix的副本-不好。

為什么不在第一個while循環中實例化objectVector。 例如這樣:

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

然后,您無需清除此內容。

更換

objectVector.clear() 

objectVector = new Vector<gridObject>();

由於您已經將objectVector添加到objectMatrix中,因此在同一實例上調用clear也會在matrix中清除。 需要新的引用來放置新值。

同樣在下一行之后

objectVector.addElement(objectInstance);

新增一行

objectInstance = new gridObject();

每次在程序中,objectInstance的值都應該不同,否則它指向相同的引用。

建議:1.將Vector <>替換為List <>,這樣性能會更好。 2.在Java中,類名以大寫字母開頭。 請將gridObject更改為GridObject。

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM