将元素从一个向量移动到另一个向量

时间:2013-02-20 14:00:39

标签: java

package testing;

import java.util.Random;
import java.util.Vector;

public class Variable2Variable {


    public static void main(String[] args) {
        Vector<Vector<Integer>> lines;
        Vector<Integer> linePoints;
        Random rndNumbers = new Random();

        lines = new Vector<Vector<Integer>>();
        linePoints = new Vector<Integer>();

        for(int i = 0; i < 5; i++){
            linePoints.add(rndNumbers.nextInt(10));
            linePoints.add(rndNumbers.nextInt(10));
        }

        lines.add(linePoints);

        //linePoints.clear();

        System.out.println("Vector: lines: " + lines);
        System.out.println("Vector: linePoints: " + linePoints);
    }

}

请运行上面的代码,记下结果,然后取消注释“//linePoints.clear();”行然后再次运行它。

如何从vector'linePoints'移动元素并将它们存储到矢量'lines'中? 感谢。

1 个答案:

答案 0 :(得分:3)

而不是

    lines.add(linePoints);

    //linePoints.clear();

    System.out.println("Vector: lines: " + lines);
    System.out.println("Vector: linePoints: " + linePoints);

这样做:

    lines.add(linePoints);

    linePoints = new Vector<Integer>();

    System.out.println("Vector: lines: " + lines);
    System.out.println("Vector: linePoints: " + linePoints);

还有一些注意事项:

  • 你做的OOP都错了。您在语义上使用非结构化的Integers列表作为整数对的列表。这为自己的班级尖叫!
  • 为什么你也可以使用Vectors,当你也可以使用ArrayLists?你需要他们的线程安全性吗?

TL; DR部分

您编写的代码说明:

    lines = new Vector<Vector<Integer>>(); //create list instance holding list of Integers
    linePoints = new Vector<Integer>(); //create list instance holding list of Integers

    for(int i = 0; i < 5; i++){ // fill list of Integers with even number of Integers
        linePoints.add(rndNumbers.nextInt(10));
        linePoints.add(rndNumbers.nextInt(10));
    }

    lines.add(linePoints); 
    //add a reference pointing at the  "list of Integers **instance**" 
    //to the list of list of Integers instance
    //No copying happens here! Still only two lists, one has a reference to the other.
    //to copy, you should do: 
    //lines.add(new Vector<Integer>(linePoints));

    linePoints.clear(); //blam! this removes the integers from the list of Integers
    // as linePoints has only a reference to the list instance itself,
    // that has now the same empty list...

    System.out.println("Vector: lines: " + lines); //empty
    System.out.println("Vector: linePoints: " + linePoints); //1 element, the empty list

解释修复的工作原理:

    lines = new Vector<Vector<Integer>>(); //create list instance holding list of Integers
    linePoints = new Vector<Integer>(); //create list instance holding list of Integers

    for(int i = 0; i < 5; i++){ // fill list of Integers with even number of Integers
        linePoints.add(rndNumbers.nextInt(10));
        linePoints.add(rndNumbers.nextInt(10));
    }

    lines.add(linePoints); 
    //add a reference pointing at the  "list of Integers **instance**" 
    //to the list of list of Integers instance

    linePoints = new Vector<Integer>(); //create new empty list, 
    //and set the reference linePoints to point to that list. 
    //the original instance is left alone, lines list's reference still points to it

    //there are now 3 instances of List in memory now:
    // * new empty Vector<Integer>, linePoints references it
    // * the Vector<Vector<Integer>> instance, lines references it
    // * the "old" Vector<Integer> instance, the first element of lines references it

    System.out.println("Vector: lines: " + lines); //empty
    System.out.println("Vector: linePoints: " + linePoints); //1 element: the list, having the integers