web-dev-qa-db-fra.com

Fusion de deux arrayLists dans une nouvelle arrayList, sans doublons et dans l'ordre, en Java

J'essaie de "combiner" deux arrayLists, en produisant un nouveau arrayList qui contient tous les nombres des deux tableaux combinés combinés, mais sans aucun élément dupliqué et ils devraient être en ordre. Je suis venu avec ce code ci-dessous. Je le parcoure et cela a du sens pour moi, mais je ne suis pas sûr de pouvoir utiliser <ou> pour comparer les get (i) dans arrayLists. J'ajoute tous les éléments de array1 dans le plusArray. Ensuite, je passe en revue le plusArray et le compare à array2 pour voir si l'un des éléments de array2 existe dans plusArray. S'ils le font, je ne fais rien, mais s'ils ne le font pas, j'essaie de l'ajouter dans sa position correcte. Peut-être que mes boucles imbriquées sont utilisées de manière incorrecte? Remarque: les listes de tableaux sont triées par ordre croissant par l'utilisateur.

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

}

UPDATE: Je ne reçois plus l'exception ci-dessous. Au lieu de cela, il semble que le programme fonctionne pour toujours. J'ai changé l'emplacement où ajouter les éléments dans les conditions <et> . /// Voici l'exception que je reçois lorsque mes listes de tableaux sont les suivantes: 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)
43
Milwaukoholic

Au lieu du code que vous avez écrit, vous pouvez utiliser ArrayList.addAll() pour fusionner les listes, Collections.sort() pour le trier et enfin parcourir le tableau résultant pour supprimer les doublons. La complexité globale est donc O(n)+O(n*log(n))+O(n), ce qui équivaut à O(n*log(n)).

28
iehrlich

Tout d'abord supprimer les doublons:

arrayList1.removeAll(arrayList2);

Puis fusionnez deux arrayList:

arrayList1.addAll(arrayList2);

Enfin, triez votre liste de tableaux si vous le souhaitez:

collections.sort(arrayList1);

Si vous ne souhaitez pas modifier la liste existante, commencez par créer leurs listes de sauvegarde:

arrayList1Backup = new ArrayList(arrayList1);
66
Ediz Türkoğlu

Ajoutez ArrayList1, ArrayList2 et produisez un tableau unique ArrayList3 . Convertissez-le maintenant en 

Set Unique_set = new HashSet(Arraylist3);

dans cet ensemble unique, vous obtiendrez les éléments uniques .
Remarque

ArrayList permet de dupliquer les valeurs . Définir ne permet pas aux valeurs de dupliquer . J'espère que votre problème sera résolu.

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

vous donne Nouvelle liste: [A, B, C]

10
DilanG

Java 8 Stream API peut être utilisé à cette fin,

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, il ne faut pas oublier que distinct() utilise hashCode().

4
snr

Peut-être que mes boucles imbriquées sont utilisées de manière incorrecte?

Astuce: les boucles imbriquées ne fonctionneront pas pour ce problème. Une simple boucle for ne fonctionnera pas non plus.

Vous devez visualiser le problème.

Écrivez deux listes ordonnées sur un morceau de papier et utilisez deux doigts pour indiquer les éléments des listes respectives, parcourez-les au fur et à mesure que vous fusionnez dans votre tête. Puis traduisez votre processus de décision mentale en un algorithme, puis codez.

La solution optimale effectue un seul passage dans les deux listes. 

4
Stephen C

Ajouter des éléments dans le premier arraylist

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

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

Ajouter des éléments dans le second répertoire

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

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

Ajouter les éléments du premier arraylist dans le second arraylist

secondArrayList.addAll(firstArrayList);

Attribuer un nouvel arraylist et ajouter tous les éléments des deux arraylists

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

Attribuer un nouvel ensemble pour supprimer les entrées en double de la liste

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

Liste de tri  

Collections.sort(comboArrayList);

Sortie

 A
 B
 C
 D
 E
 F
 G
4
Hiren Patel

Votre seconde boucle devrait avoir j ++ au lieu de i ++

2
Chetter Hummin

Je ne suis pas sûr de savoir pourquoi votre code actuel échoue (quelle est l'exception que vous obtenez?), Mais je tiens à souligner que cette approche donne un résultat N (carré). Envisagez de pré-trier vos tableaux d'entrée (s'ils ne sont pas définis comme étant pré-triés) et de fusionner les tableaux triés:

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

Le tri est généralement O (N logN) et la fusion est O (m + n).

2
Eric J.

Voici une solution utilisant Java 8:

Stream.of(list1, list2)
    .flatMap(Collection::stream)
    .distinct()
    // .sorted() uncomment if you want sorted list
    .collect(Collectors.toList());
1
nxhoaf

votre boucle imbriquée 

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

est infini car j sera toujours égal à zéro, par contre, je serai augmenté à volonté dans cette boucle. Vous obtenez OutOfBoundaryException quand i est plus grand que plusArray.size ()

1
Southeast

J'ai compris que vous ne souhaitiez pas utiliser les fonctions intégrées pour fusionner ou supprimer les doublons de la liste de tableaux . Votre premier code est en cours d'exécution pour toujours, car la condition de boucle for externe est 'Always True'. Étant donné que vous ajoutez des éléments à plusArray, la taille de celui-ci augmente à chaque ajout et, par conséquent, «i» est toujours inférieur à ce dernier. En conséquence, la condition n'échoue jamais et le programme est exécuté à tout jamais ... Astuce: essayez de fusionner d'abord la liste, puis supprimez les éléments en double de la liste fusionnée. :)

0
Rinks
**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);
}

}

Sortie: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

0