【问题标题】:Java using the Vector class - MatrixJava 使用 Vector 类 - Matrix
【发布时间】:2013-12-29 21:34:42
【问题描述】:

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

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

我想象的收集数据的方式是通过向量 - 矩阵,或者 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() 时添加了新数组后,它会从我的矩阵中删除数组吗?我怎样才能防止这种情况?我以为它会存储在矩阵中,但是矩阵和数组保持连接。

【问题讨论】:

  • 你的问题很不清楚。请提供一小部分输入样本、您的实际输出和预期输出。
  • 我的 .txt 文件输入类似于这样的统计信息 a1 population1: [4.23 +9.98 15 +3.23 +9.98 29] population2: [20 +6.5 13 +1.23 +2.98] .
  • 我的矩阵应该像 [[population1, 4.23, 9.98, 15, 3.23, 9.98, 29], [population2, 20, 6.5, 13, 1.23, 2.98]] 但我得到了什么这种情况是 [[population2, 20, 6.5, 13, 1.23, 2.98], [population2, 20, 6.5, 13, 1.23, 2.98]]

标签: java vector matrix


【解决方案1】:

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

我并不完全清楚你在做什么的逻辑,但纠正这个问题可能就像换行一样简单

array.clear();

array = new Vector<>();

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

【讨论】:

  • 就是这样!非常感谢你!我基本上遇到了我的矩阵与数组保持动态连接的问题,我认为一旦我将一个数组添加到矩阵,它们的链接就会断开,所以一旦我清除了数组,我就可以在矩阵中添加另一个数组,但事实并非如此.现在可以了!
  • 太棒了!如果你再清理一下你的代码,它可能看起来很像 Elliott Frisch 发布的内容。既然问题已经解决,请接受其中一个答案。
【解决方案2】:

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

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.
  }
}

【讨论】:

  • +1:这看起来是对的。我没有通过足够多的匹配器代码来确定完全替换。
【解决方案3】:

使用地图会更好,也许你可以为你的地图形成自定义对象。

【讨论】:

  • 是的,我知道,我不得不使用 Vector。不过谢谢
  • 你为什么“必须使用 Vector”?
  • 我有一些考试规范,我知道可以更轻松地完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2021-11-30
相关资源
最近更新 更多