所以我有以下问题。我从.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()
时添加新数组后,它会从我的矩阵中删除数组?我怎么能防止这种情况?我以为它将存储在矩阵中,但矩阵和数组保持连接。
答案 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,也可以为地图形成自定义对象。