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);