Создать отдельный список <String> - PullRequest
1 голос
/ 15 февраля 2020

У меня есть три списка типа List<String> с именами list1, list2 и list3.

. Я добавляю некоторые элементы в list1, а затем копирую их в новый список, который это list2. Затем я создаю list3, чтобы добавить еще несколько элементов, а затем снова скопировать их в list2. Тем не менее, мне нужно, чтобы list2 содержал отдельные элементы, так как бы мне исключить дубликаты и не добавлять их в list2?

Вот что я попробовал:

List<String> list2 = new ArrayList<>();
List<String> list1 = new ArrayList<>();

                list1.add("String1");
                list1.add("String2");

                list2.addAll(list1);

List<String> list3 = new ArrayList<>();

list3.add("String1");
list3.add("String3");

list2.addAll(list3);

Ответы [ 5 ]

0 голосов
/ 15 февраля 2020
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

public final class Answer {
    private static final List<String> LIST_ONE = Arrays.asList("String1", "String2");
    private static final List<String> LIST_THREE = Arrays.asList("String1", "String3");

    public static void main(String... args) {
        // if order is not important then use a java.util.HashSet instead
        final Set<String> strings = new LinkedHashSet<>(LIST_ONE);
        strings.addAll(LIST_THREE);

        final List<String> list_two = new ArrayList<>(strings);

        System.out.println("list_two = " + list_two);
    }

}
0 голосов
/ 15 февраля 2020

Вместо использования List для list2 следует использовать Set. Обратите внимание, что List позволяет иметь повторяющиеся значения, а Set отбрасывает дублирующиеся значения. Проверьте разницу в результатах:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        List<String> list3 = new ArrayList<>();

        list1.add("String1");
        list1.add("String2");

        list3.add("String1");
        list3.add("String3");

        List<String> list2 = new ArrayList<>();
        list2.addAll(list1);
        list2.addAll(list3);
        System.out.println(list2);

        Set<String> set = new HashSet<>();
        set.addAll(list1);
        set.addAll(list3);
        System.out.println(set);
    }
}

Вывод:

[String1, String2, String1, String3]
[String3, String2, String1]
0 голосов
/ 15 февраля 2020

Вы должны использовать шаблонный итератор, чтобы удалить элемент из списка, это будет хорошо работать для вас:

    Iterator<String> iter = list2.iterator();
    String value = "String1";
    while(iter.hasNext()) {
        if(iter.next().equals(value)) {
            iter.remove();
        }
    }
0 голосов
/ 15 февраля 2020

Ниже я приведу пример того, что вы ожидаете. Перед добавлением элементов list3 в list2 мы отфильтруем все элементы из list2, которые также присутствуют в list3 .

import java.util.*;

public class Main {
    public static void main(String args[]) {
        ArrayList<String> list1 = new ArrayList<>();
        ArrayList<String> list2 = new ArrayList<>();
        ArrayList<String> list3 = new ArrayList<>();


        list1.add("string1");
        list1.add("string2");
        list1.add("string4");

        list2.addAll(list1);

        System.out.println("\nPrinting List2 Elements");
        for(String element : list2){
            System.out.println(element);
        }

        list3.add("string3");
        //these will be the duplicates that we will find in list2, 
        //before adding list3, we will remove them from list 2
        list3.add("string2"); 
        list3.add("string1");

        //filtering out list3 elements from list2
        System.out.println("\nPrinting List3 Elements");

        for(String element : list3){
            System.out.println(element);
            int indexOfElement = list2.indexOf(element);
            if(indexOfElement != -1) //means it has found the element in the list
            {
                list2.remove(indexOfElement);
            }
        }

        //Now list2 doesn't contain any element that exists in list3
        System.out.println("\nPrinting List2 Elements after filtering");
        for(String element : list2){
            System.out.println(element);
        }



        list2.addAll(list3);

        System.out.println("\nPrinting List2 Elements");
        for(String element : list2){
            System.out.println(element);
        }
    }
}

Вот пример вывода с исходным кодом ссылка

0 голосов
/ 15 февраля 2020

Зависит от количества «усилий», которые вы хотите вложить в него, и размера списков (и, следовательно, производительности).

Вы можете просто перебрать элементы list3:

list3.forEach(s ->
{
    if (list2.contains(s))
    {
        list2.remove(s);
    }
    else
    {
        list2.add(s);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...