Объединение двух массивов в новый, без дубликатов и по порядку, в 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 ]

1 голос
/ 29 марта 2012

Ваш вложенный цикл

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

бесконечно, поскольку j всегда будет равно нулю, с другой стороны, я буду увеличиваться по желанию в этом цикле. Вы получаете OutOfBoundaryException, когда я больше, чем plusArray.size ()

0 голосов
/ 12 августа 2017

Я понял, что вы не хотите использовать встроенные функции для объединения или удаления дубликатов из ArrayList.Ваш первый код выполняется вечно, потому что внешнее условие цикла - «Всегда верно».Поскольку вы добавляете элементы в plusArray, размер plusArray увеличивается с каждым добавлением, и, следовательно, «i» всегда меньше его.В результате условие никогда не перестает работать, и программа работает вечно.Совет: попробуйте сначала объединить список, а затем из объединенного списка удалить повторяющиеся элементы.:)

0 голосов
/ 07 февраля 2016
**Add elements in Final arraylist,**
**This will Help you sure**

import java.util.ArrayList;
import java.util.List;

public class NonDuplicateList {

public static void main(String[] args) {

    List<String> l1 = new ArrayList<String>();
    l1.add("1");l1.add("2");l1.add("3");l1.add("4");l1.add("5");l1.add("6");
    List<String> l2 = new ArrayList<String>();
    l2.add("1");l2.add("7");l2.add("8");l2.add("9");l2.add("10");l2.add("3");
    List<String> l3 = new ArrayList<String>();
    l3.addAll(l1);
    l3.addAll(l2);
    for (int i = 0; i < l3.size(); i++) {
        for (int j=i+1; j < l3.size(); j++) {
             if(l3.get(i) == l3.get(j)) {
                 l3.remove(j);
            }
        }
    }
    System.out.println(l3);
}

}

Выход: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

0 голосов
/ 22 августа 2015

Вам не нужно кодировать это вручную. Проблемой является именно поведение Apache Commons CollectionUtils # collate . Он также перегружен для разных порядков сортировки и допускает дублирование.

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