Java 复制ArrayList中在每次迭代时更新其数据的所有数据
我在的Java 复制ArrayList中在每次迭代时更新其数据的所有数据,java,arraylist,Java,Arraylist,我在的中有一个列表,它在每次迭代中都会更改数据。我想返回一个ArrayList,其中包含存储在列表wordForms中的所有数据 List<String> wordForms = new ArrayList(); List<Synset> synsetsNoun = wordnet.getNounSynsetsOf(category); for (Synset synset : synsetsNoun) { wordForms = WordNetSynset.g
中有一个列表
,它在每次迭代中都会更改数据。我想返回一个ArrayList
,其中包含存储在列表wordForms
中的所有数据
List<String> wordForms = new ArrayList();
List<Synset> synsetsNoun = wordnet.getNounSynsetsOf(category);
for (Synset synset : synsetsNoun) {
wordForms = WordNetSynset.getWordFormsOf(synset);
System.out.println("\ts: " + wordForms);
}
在第一次迭代中
Element3
Element4
Element5
在第二次迭代中,等等
然后,所需的输出将是一个ArrayList
,其中包含所有这些元素:
Element1
Element2
Element3
Element4
Element5
尝试:
List wordForms=new ArrayList();
List synsetsNoun=wordnet.getNounSynsetsOf(类别);
for(Synset-Synset:synsetsNoun){
add(WordNetSynset.getWordFormsOf(synset));
}
System.out.println(“\ts:+wordForms”);
这是假设您的getWordFormsOf(…)
方法返回字符串对象。如果是这样,这段代码将把该字符串添加到ArrayList中
另一方面,如果getWordFormsOf
方法返回一个字符串对象列表,则可以使用:
for(Synset-Synset:synsetsNoun){
addAll(WordNetSynset.getWordFormsOf(synset));
}
目前,您正在重新分配wordForms
变量每次迭代
相反,您需要添加每个迭代中的元素。您可以使用方法ArrayList#add
()来执行此操作
但是,当前您正在获取要添加的元素集合(ArrayList
)。现在,您可以迭代所有这些元素,并将它们分别添加到wordForms
中,或者使用指定的方法ArrayList#addAll
(),该方法在幕后执行相同的操作
for (Synset synset : synsetsNoun) {
// Fetch the elements to add
ArrayList<String> elementsToAdd = WordNetSynset.getWordFormsOf(synset);
// Add the elements to the list
wordForms.addAll(elementsToAdd);
}
// Print the contents
System.out.println("\ts: " + wordForms);
for(Synset-Synset:synsetsNoun){
//获取要添加的元素
ArrayList elementsToAdd=WordNetSynset.getWordFormsOf(synset);
//将元素添加到列表中
addAll(elementsToAdd);
}
//打印内容
System.out.println(“\ts:+wordForms”);
或者,如果您想在Java 8中以功能风格尝试此功能:
List<String> wordForms = synsetsNoun.stream() // Synsets
.map(WordNetSynset::getWordFormsOf) // Lists of wordForms
.flatMap(Collection::stream) // WordForms
.collect(Collectors.toCollection(ArrayList::new)); // Collect to ArrayList
// Print the contents
System.out.println("\ts: " + wordForms);
List wordForms=synsetsNoun.stream()//Synsets
.map(WordNetSynset::getWordFormsOf)//wordForms列表
.flatMap(Collection::stream)//WordForms
.collect(收集器.toCollection(ArrayList::new));//收集到ArrayList
//打印内容
System.out.println(“\ts:+wordForms”);
如果您使用的是java 8,则可以使用流来实现此目的。根据您给定的代码WordNetSynset.getWordFormsOf(synset)
将返回List
。
所以您可以用下面的行替换行wordForms=WordNetSynset.getWordFormsOf(synset)
List<String> wordForms = new ArrayList();
List<Synset> synsetsNoun = wordnet.getNounSynsetsOf(category);
for (Synset synset : synsetsNoun) {
wordForms = Stream.concat(wordForms.stream(), WordNetSynset.getWordFormsOf(synset).stream())
.collect(Collectors.toList());
}
System.out.println("\ts: " + wordForms);
List wordForms=new ArrayList();
List synsetsNoun=wordnet.getNounSynsetsOf(类别);
for(Synset-Synset:synsetsNoun){
wordForms=Stream.concat(wordForms.Stream(),WordNetSynset.getWordFormsOf(synset.Stream())
.collect(Collectors.toList());
}
System.out.println(“\ts:+wordForms”);
另外,如果您想从wordForms列表中删除重复项,您可以将.distinct()
函数添加到您的流中。对于初学者,您将在每次迭代时重新分配它……这意味着只有最后一次调用才有效。您能给我们一个示例输入、此示例的当前输出和所需输出吗?目前,要获得您想要实现的目标并不是那么容易。作为旁注,您不应该使用原始类型(如new ArrayList()
)创建ArrayList
)。改用new ArrayList()
或菱形运算符new ArrayList()
,因为编译器已经知道了类型,因为List wordForms=…
。您能解释一下您所做的更改以及它解决问题的原因吗?@Zabuza,假设getWordFormsOf
返回String
我只将该字符串添加到ArrayList中。您可以将其包含在答案中以提高其质量。然而,我认为该方法返回一个完整的元素集合ArrayList
。否则OP将无法使用它重新分配wordForms
。感谢您的提示,@ZabuzaZabusa是正确的,GetWordForms将返回ArrayList。谢谢你的回答,谢谢!我将使用Stream添加distinct()函数。它工作得很好。我不认为只在下半年使用Stream
有什么好处。您可以在整个过程中使用它,在synstetnoun
上使用流
,然后映射到WordNetSynset::getWordFormsOf
,然后平面映射到它们的流
,最后收集。请注意,您当前的收集方式并不能确保最后有一个ArrayList
(以防万一OP对此有问题)。@Zabuza您的回答是正确的,我刚刚指出了主要问题,即使用流连接列表的方法。
List<String> wordForms = synsetsNoun.stream() // Synsets
.map(WordNetSynset::getWordFormsOf) // Lists of wordForms
.flatMap(Collection::stream) // WordForms
.collect(Collectors.toCollection(ArrayList::new)); // Collect to ArrayList
// Print the contents
System.out.println("\ts: " + wordForms);
List<String> wordForms = new ArrayList();
List<Synset> synsetsNoun = wordnet.getNounSynsetsOf(category);
for (Synset synset : synsetsNoun) {
wordForms = Stream.concat(wordForms.stream(), WordNetSynset.getWordFormsOf(synset).stream())
.collect(Collectors.toList());
}
System.out.println("\ts: " + wordForms);