Java使用向量类-矩阵

Java使用向量类-矩阵,java,vector,matrix,Java,Vector,Matrix,所以我有以下问题。我从一个.txt文件中解析出文本,文本包含我需要收集的两组数据-特定ID和一组链接到每个ID的双数字。例如: ID1: [3.21 23.3 15 . .] ID2: [. . .]. 我想象的收集数据的方式是通过向量矩阵,或者 向量矩阵=新向量()。所以基本上我会把每个ID作为矩阵中每一行的第一个元素(位置0)来读取,然后我会把两个数字作为字符串分别读取到下面的行中。我稍后会做转换。现在检查我的代码: Vector<Vector<String>> m

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

ID1:
[3.21
23.3
15
.
.]
ID2:
[.
.
.].
我想象的收集数据的方式是通过向量矩阵,或者
向量矩阵=新向量()。所以基本上我会把每个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));
    }
}
向量矩阵=新向量();
向量数组=新向量();
而(s.hasNext())
{
字符串数据=s.next();
Matcher matcherDouble=patternDouble.Matcher(数据);
Matcher matcherID=patternID.Matcher(数据);
if(matcherID.find())
{
System.out.println(“发现:+matcherID.group(1));
/*********************************/
if(!(array.isEmpty())
{
矩阵。添加(数组);
}
/**********************************/
array.clear();
add(matcherID.group(1));
}
if(matcherDouble.find())
{
System.out.println(“发现:+matcherDouble.group(3));
add(matcherDouble.group(3));
}
}
我正确地解析了所有内容,因此这部分代码足以解释我的问题。因为我需要一个矩阵,所以我决定单独收集数组,同时将它们添加到矩阵中。根据不同ID的数量,我将添加尽可能多的数组

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


我的问题是,一旦我将第一个数组添加到矩阵中,矩阵就会随着数组的更改而动态变化。例如,当我在下一步执行以下行时添加了新数组
array.clear()
,它会从我的矩阵中删除该数组吗?我怎样才能防止呢?我原以为它将存储在矩阵中,但矩阵和数组保持连接。

您重复添加相同的
向量并清除它。您需要为每一行创建一个新的
向量

我不完全清楚你在做什么的逻辑,但纠正这个问题可能和改变路线一样简单

array.clear();

array=newvector();

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

据我所知,你确实需要做如下四个更改

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.
  }
}
向量矩阵=新向量();
//向量数组=新向量();
而(s.hasNext()){

Vector array=new Vector();//最好使用Map,也许你可以为你的地图创建自定义对象。

你的问题很不清楚。请提供一个输入、实际输出和预期输出的小样本。我在.txt文件中的输入类似于统计a1填充1:[4.23+9.98 15+3.23+9.98 29]人口2:[20+6.513+1.23+2.98]。我的矩阵应该像[[人口1,4.23,9.98,15,3.23,9.98,29],[人口2,20,6.5,13,1.23,2.98]]但我在这种情况下得到的是[[人口2,20,6.5,13,1.23,1.23,1.23,2.98],[人口2,20,6.5,13,1.23,2.98]]是的,我知道,我必须使用向量。谢谢你为什么“必须使用向量"?我有一些测试规范,我知道可以更容易地完成。+1:这看起来是对的。我没有仔细阅读足够的匹配器代码,没有信心完全替换。就是这样!非常感谢!我基本上有一个问题,我的矩阵与数组保持动态连接,我想一旦我在矩阵中添加了一个数组,我就不会继承人链接已断开,因此,一旦我清除数组,我可以向矩阵中添加另一个,但事实并非如此。现在它可以工作了!太棒了!如果你再清理一下代码,它可能看起来与Elliott Frisch发布的内容非常相似。现在问题已经解决,请接受其中一个答案。
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.
  }
}