gpt4 book ai didi

Java:在不实例化新列表的情况下深度复制列表条目

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:53:50 26 4
gpt4 key购买 nike

我在执行编程任务时遇到了一个小问题。我想从文件中读取一些行(到目前为止没问题)并将其标记化。每行大约有 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) 列表位置,依此类推。

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

最佳答案

问题是,您只创建了一个列表,并通过在每次迭代中修改它来将对该列表的引用添加到外部列表。因此,对该列表所做的最终修改将反射(reflect)在所有引用中。

你可以通过在循环中每次创建一个新的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)));
}

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

关于Java:在不实例化新列表的情况下深度复制列表条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14612528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com