Объединение двух массивов в новый, без дубликатов и по порядку, в Java - PullRequest
45 голосов
/ 29 марта 2012

Я пытаюсь «объединить» два arrayList, получая новый arrayList, который содержит все числа в двух комбинированных arrayLists, но без каких-либо дублирующих элементов, и они должны быть в порядке.Я придумал этот код ниже.Я бегу через это, и это имеет смысл для меня, но я не уверен, могу ли я использовать <или> для сравнения get (i) в arrayLists.Я добавляю все элементы в массиве1 в массив плюс.Затем я прохожу plusArray и сравниваю его с array2, чтобы увидеть, существует ли какой-либо из элементов array2 внутри plusArray.Если они делают, я ничего не делаю, но если они этого не делают, я пытаюсь добавить это в правильное положение.Возможно, мои вложенные циклы используются неправильно?Примечание: ArrayLists предварительно сортируются пользователем в порядке возрастания.

     ArrayList<Integer> plusArray = new ArrayList<Integer>();
for(int i = 0; i < array1.size(); i++){
    plusArray.add(array1.get(i));
}

for(int i = 0; i < plusArray.size(); i++){
    for(int j = 0; j < array2.size(); j++){

    if(array2.get(j) < plusArray.get(i)){
        plusArray.add(i,array2.get(j));
    }
    else if(plusArray.get(i).equals(array2.get(j))){
        ;
    }
    else if(array2.get(j) > plusArray.get(i)){
        plusArray.add(i, array2.get(j));
    }

}

ОБНОВЛЕНИЕ: я больше не получаю исключение ниже.Вместо этого кажется, что программа работает вечно.Я изменил местоположение, куда добавлять элементы в условиях <и>./// Вот исключение, которое я получаю, когда мои списки массивов: IntSet 1: {1 2} IntSet 2: {1 3 4}

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at IntSet.plus(IntSet.java:92)
at IntSetDriver.main(IntSetDriver.java:61)

Ответы [ 14 ]

70 голосов
/ 16 января 2013

Сначала удалите дубликаты:

arrayList1.removeAll(arrayList2);

Затем объедините два arrayList:

arrayList1.addAll(arrayList2);

Наконец, сортируйте свой arrayList, если хотите:

collections.sort(arrayList1);

НаВы не хотите вносить какие-либо изменения в существующий список, сначала создайте их списки резервных копий:

arrayList1Backup = new ArrayList(arrayList1);
29 голосов
/ 29 марта 2012

Вместо кода, который вы написали, вы можете использовать ArrayList.addAll() для объединения списков, Collections.sort() для сортировки и, наконец, пересечь получившийся ArrayList для удаления дубликатов. Таким образом, совокупная сложность равна O(n)+O(n*log(n))+O(n), что эквивалентно O(n*log(n)).

12 голосов
/ 29 марта 2012

Добавьте ArrayList1, ArrayList2 и создайте отдельный массив ArrayList3.Теперь конвертируйте его в

Set Unique_set = new HashSet(Arraylist3);

, в уникальный набор которого вы получите уникальные элементы.
Примечание

ArrayList позволяет дублировать значения. Set не позволяет дублировать значения.Надеюсь, ваша проблема решится.

10 голосов
/ 13 мая 2014
List<String> listA = new ArrayList<String>();

    listA.add("A");
    listA.add("B");

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

    listB.add("B");
    listB.add("C");

Set<String> newSet = new HashSet<String>(listA);

    newSet.addAll(listB);
List<String> newList = new ArrayList<String>(newSet);

System.out.println("New List :"+newList);

дает вам Новый список: [A, B, C]

6 голосов
/ 16 июня 2017

Java 8 Stream API может использоваться для этой цели,

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

list1.add("A");
list1.add("B");
list1.add("A");
list1.add("D");
list1.add("G");

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

list2.add("B");
list2.add("D");
list2.add("E");
list2.add("G");

List<String> noDup = Stream.concat(list1.stream(), list2.stream())
                     .distinct()
                     .collect(Collectors.toList());
noDup.forEach(System.out::println);

En passant, не следует забывать, что distinct() использует hashCode().

4 голосов
/ 05 мая 2015

Добавление элементов в первый список

ArrayList<String> firstArrayList = new ArrayList<String>();

firstArrayList.add("A");
firstArrayList.add("B");
firstArrayList.add("C");
firstArrayList.add("D");
firstArrayList.add("E");

Добавление элементов во второй массив

ArrayList<String> secondArrayList = new ArrayList<String>();

secondArrayList.add("B");
secondArrayList.add("D");
secondArrayList.add("F");
secondArrayList.add("G");

Добавить элементы первого массива во второй массив

secondArrayList.addAll(firstArrayList);

Назначить новый комбинированный массив и добавить все элементы из обоих массивов

ArrayList<String> comboArrayList = new ArrayList<String>(firstArrayList);
comboArrayList.addAll(secondArrayList);

Назначить новый набор для удаления повторяющихся записей из массива

Set<String> setList = new LinkedHashSet<String>(comboArrayList);
comboArrayList.clear();
comboArrayList.addAll(setList);

Сортировка массива

Collections.sort(comboArrayList);

выход

 A
 B
 C
 D
 E
 F
 G
4 голосов
/ 29 марта 2012

Возможно, мои вложенные циклы используются неправильно?

Подсказка: вложенные циклы не будут работать для этой проблемы. Простой цикл for тоже не сработает.

Вам нужно визуализировать проблему.

Напишите два упорядоченных списка на листе бумаги и, используя два пальца, чтобы указать элементы соответствующих списков, проходите по ним, как вы делаете слияние в своей голове. Затем переведите свой умственный процесс принятия решений в алгоритм, а затем кодируйте.

Оптимальное решение - один проход через два списка.

2 голосов
/ 03 апреля 2018

Вот одно решение с использованием Java 8:

Stream.of(list1, list2)
    .flatMap(Collection::stream)
    .distinct()
    // .sorted() uncomment if you want sorted list
    .collect(Collectors.toList());
2 голосов
/ 29 марта 2012

Я не уверен, почему ваш текущий код не работает (какое исключение вы получаете?), Но я хотел бы отметить, что этот подход выполняет O (N-квадрат).Рекомендуется предварительно отсортировать входные массивы (если они не определены как предварительно отсортированные) и объединить отсортированные массивы:

http://www.algolist.net/Algorithms/Merge/Sorted_arrays

Сортировка обычно выполняется за O (N logN), аобъединение O (m + n).

2 голосов
/ 29 марта 2012

Ваш второй цикл for должен иметь j ++ вместо i ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...