3

我在执行编程任务时遇到了一个小问题。我想从文件中读取一些行(到目前为止没问题)并对其进行标记。每行大约有 4 个标记,每个标记都应该在列表中找到一个位置。最后,每一行也应该在一个列表中。

一个小例子来澄清这一点:

文件内容:

foo boo bar
bii buu baa

输出:

[[foo, boo, bar], [bii, buu, baa]]

这是我正在处理的代码

String fileContent = fileloader(file.toString());
List<String> linesList = new ArrayList<String>();
String[] lines = fileContent.split("\n"); 
for(String line:lines){
  String[] splittedLine = line.split("\t");
  for(String words:splittedLine){
    linesList.add(words);
  }
  lexiconContent.add(linesList); 
  linesList.removeAll(linesList);
}

我想引用有问题,因为第一次迭代效果很好!但在第二次迭代中,它会将实际的第二个内容也复制到第一个(0)列表位置,依此类推。

最后我得到了类似的东西[[], [], [], []]

4

2 回答 2

3

问题是,您只创建了一个列表,并将对该列表的引用添加到您的外部列表中,方法是在每次迭代时对其进行修改。因此,对该列表所做的最终修改将反映在所有参考文献中。

linesList您可以通过在循环中每次创建一个新的来解决此问题:-

List<String> linesList = null;  // Don't initialize here
String[] lines = fileContent.split("\n"); 

for(String line:lines){
    String[] splittedLine = line.split("\t");
    linesList = new ArrayList<String>(); // Initialize a new list everytime.

    for(String words:splittedLine){
        linesList.add(words);
    }
    lexiconContent.add(linesList); 
}

是的,您还可以将 for 循环简化为:-

for(String line:lines){
    String[] splittedLine = line.split("\t");
    lexiconContent.add(new ArrayList<String>(Arrays.asList(splittedLine))); 
}

这样,您不必遍历数组并将单个元素添加到列表中。事实上,您根本不需要中间列表。

于 2013-01-30T19:58:46.013 回答
0

在您的代码中..而不是为循环中的每个迭代创建新的 ArrayList:for(String line:lines)您只是在ArrayList从外部循环的第一次迭代中使用的旧对象中添加单词(在嵌套循环中)并存储相同的参考值在 ArrayList 的所有后续索引lexiconContent处。此外,在外循环的每次迭代结束时,您正在清除linesList.So 最后,您仍然在lexiconContent... 中保留 N 个条目,其中 lexiconContent 的每个索引处的元素只不过是参考值ArrayList(lineList) 的单个对象是空的!!!

You should use following code instead:
String fileContent = fileloader(file.toString());
List<String> linesList = null;
String[] lines = fileContent.split("\n"); 
for(String line:lines){
  List<String> linesList = new ArrayList<String>();
  String[] splittedLine = line.split("\t");
  for(String words:splittedLine){
    linesList.add(words);
  }
  lexiconContent.add(linesList); 
}
于 2013-01-30T20:27:12.513 回答