使用Vector类的Java - Matrix

时间:2013-12-29 21:34:43

标签: java vector matrix

所以我有以下问题。我从.txt文件中解析出文本,文本包含我需要收集的两组数据 - 某个ID和一组链接到每个ID的双数。例如:

ID1:
[3.21
23.3
15
.
.]
ID2:
[.
.
.].

我想象的收集数据的方式是通过Vector - matrix,或 Vector<Vector<String>> matrix = new Vector<Vector<String>>();。所以基本上我会将每个ID读作矩阵中每行的第一个元素(位置0),然后我将分别在后面的行中读取双数字作为字符串。我稍后会进行转换。现在检查我的代码:

Vector<Vector<String>> matrix = new Vector<Vector<String>>();
Vector<String> array = new Vector<>();

while(s.hasNext())
{
    String data = s.next();

    Matcher matcherDouble = patternDouble.matcher(data);
    Matcher matcherID = patternID.matcher(data);

    if(matcherID.find())
    {
        System.out.println("found: " + matcherID.group(1));

        /*********************************/
        if(!(array.isEmpty()))
        {
            matrix.add(array);
        }
        /**********************************/
        array.clear();
        array.add(matcherID.group(1));
    }

    if(matcherDouble.find())
    {
        System.out.println("found: " + matcherDouble.group(3));
        array.add(matcherDouble.group(3));
    }
}

我正确解析了所有内容,因此这部分代码足以解释我的问题。因为我需要一个矩阵,所以我决定单独收集数组,并在相同的温度下将它们添加到矩阵中。根据不同ID的数量,我将添加多个数组。

在通过if( matcherID.find())的第一个循环中,我不会向矩阵添加一个数组,因为这是我获取第一个ID时,在将数组添加到矩阵之前我还需要其他元素。每次在这之后,我的条件if(!( array.isEmpty()))将被满足,我将添加另一个数组到矩阵。

我的问题是,一旦我将第一个数组添加到矩阵中 - 当我更改数组时,矩阵开始动态变化。例如,当我在下一步执行以下行array.clear()时添加新数组后,它会从我的矩阵中删除数组?我怎么能防止这种情况?我以为它将存储在矩阵中,但矩阵和数组保持连接。

3 个答案:

答案 0 :(得分:1)

您反复添加相同的Vector<String>并清除它。您需要为每一行创建一个新的Vector<String>

我对你正在做的事情的逻辑并不完全清楚,但纠正这个问题可能就像改变行一样简单

array.clear();

array = new Vector<>();

这是因为所有这些对象实际上都是作为引用保存的,并且您添加到矩阵中的条目(行)实际上只是对array变量引用的同一对象的引用。如果您希望它们不同,则必须创建新对象。

答案 1 :(得分:1)

据我所知,您确实需要进行以下四项更改

Vector<Vector<String>> matrix = new Vector<Vector<String>>();
// Vector<String> array = new Vector<>();

while (s.hasNext()) {
  Vector<String> array = new Vector<>(); // <-- declare it here.
  String data = s.next();

  Matcher matcherDouble = patternDouble
      .matcher(data);
  Matcher matcherID = patternID.matcher(data);

  if (matcherID.find()) {
    System.out.println("found: "
        + matcherID.group(1));
    array.add(matcherID.group(1)); // <----- add the match(s)
    if (matcherDouble.find()) {    // <----- including the double.
      System.out.println("found: "
          + matcherDouble.group(3));
      array.add(matcherDouble.group(3));
    }
    /*********************************/
    if (!(array.isEmpty())) {
      matrix.add(array);
    }
    /**********************************/
    // array.clear(); <---------------------- Not needed. new vector on next iteration.
  }
}

答案 2 :(得分:1)

最好使用Map,也可以为地图形成自定义对象。