复制ArrayList中的所有数据,在每次迭代时更新其数据

时间:2017-10-12 15:07:49

标签: java arraylist

我在List<String>中有一个for,可以在每次迭代时更改其数据。我想返回一个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);
}

在第一次迭代中,wordForm有5个元素,第二次迭代有3个元素,依此类推。

我想使用所有元素返回ArrayList,我该怎么做?

作为一个例子,假设我得到ArrayList<String>喜欢

Element1
Element2

在第一次迭代中,然后

Element3
Element4
Element5

在第二次迭代中,依此类推。

然后,所需的输出将是包含所有这些元素的ArrayList<String>

Element1
Element2
Element3
Element4
Element5

3 个答案:

答案 0 :(得分:1)

尝试:

List<String> wordForms = new ArrayList();
List<Synset> synsetsNoun = wordnet.getNounSynsetsOf(category);

for (Synset synset : synsetsNoun) {
    wordForms.add(WordNetSynset.getWordFormsOf(synset));
}

System.out.println("\ts: " + wordForms);

这假设您的getWordFormsOf(...)方法返回一个String对象。如果是这样,这段代码将把String添加到您的ArrayList中。

另一方面,如果您的getWordFormsOf方法返回可能使用的String对象列表:

for (Synset synset : synsetsNoun) { wordForms.addAll(WordNetSynset.getWordFormsOf(synset)); }

答案 1 :(得分:1)

目前,重新分配您的wordForms变量每次迭代

而不是你需要添加每次迭代的元素。您可以使用ArrayList#adddocumentation)方法执行此操作。

但是目前您要提取元素集来添加(ArrayList<String>)。您现在可以迭代所有这些元素并将它们单独添加到wordForms或使用指定的方法ArrayList#addAlldocumentation),它在幕后也是如此。

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

或者,如果您想在 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);

答案 2 :(得分:0)

如果您使用的是Java 8,则可以使用Stream。根据您的代码,WordNetSynset.getWordFormsOf(synset)将返回List<String>。 因此,您可以使用以下行替换行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);

此外,如果您想从wordForms列表中删除重复项,可以将.distinct()功能添加到您的流中。