Fusion de deux arrayLists en un nouveau arrayList, sans doublons et dans l'ordre, en Java

j'essaie de "combiner" deux arrayLists, produisant un nouveau arrayList qui contient tous les nombres dans les deux arrayLists combinés, mais sans aucun élément dupliqué et ils devraient être dans l'ordre. Je suis venu avec ce code ci-dessous. Je cours à travers et cela a du sens pour moi, mais je ne suis pas sûr si je peux utiliser pour comparer get(i)'S dans arrayLists. J'ajoute tous les éléments du tableau 1 dans le plusArray. Puis je passe en revue le plusArray et le compare à array2 pour voir si l'un des les éléments d'array2 existent à l'intérieur de plusArray. Si ils le font je fais rien, mais si ils ne sont pas alors j'essaie de l'ajouter dans sa position correcte. Peut-être que mes boucles sont mal utilisées? Note: les tableaux sont présentés par l'utilisateur dans un ordre croissant.

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

}

mise à jour: 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 de l'endroit où ajouter les éléments dans les conditions. /// Voici l'exception que j'obtiens quand mon tableau liste sont: 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)
39
demandé sur Ren 2012-03-29 04:56:39

14 réponses

au lieu du code que vous avez écrit, Vous pouvez utiliser ArrayList.addAll() fusionner les listes, Collections.sort() pour le trier et finalement traverser de L'ArrayList résultant pour enlever les doublons. La complexité globale est donc O(n)+O(n*log(n))+O(n) est équivalent à O(n*log(n)).

27
répondu iehrlich 2017-03-19 16:36:19

first remove duplicates:

arrayList1.removeAll(arrayList2);

puis fusionner deux tableaux:

arrayList1.addAll(arrayList2);

enfin, triez votre arrayList si vous le souhaitez:

collections.sort(arrayList1);

dans le cas où vous ne voulez pas faire de changements sur la liste existante, créez d'abord leurs listes de sauvegarde:

arrayList1Backup = new ArrayList(arrayList1);
62
répondu Ediz Türkoğlu 2015-08-07 21:33:24

ajouter ArrayList1, ArrayList2 et produire une seule ArrayList ArrayList3. Maintenant convertissez-le en

Set Unique_set = new HashSet(Arraylist3);

dans l'ensemble unique vous obtiendrez les éléments uniques.

Remarque:

ArrayList permet de dupliquer des valeurs. Set ne permet pas aux valeurs de dupliquer. J'espère que votre problème en résout.

11
répondu special 2012-03-29 08:38:57
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);

est de vous donner Nouvelle Liste: [A, B, C]

10
répondu DilanG 2014-05-13 07:17:25

peut-être mon emboîté pour boucles étant utilisé incorrectement?

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

vous devez visualiser le problème.

écrivez deux listes ordonnées sur un morceau de papier, et en utilisant deux doigts pour pointer les éléments des listes respectives, marchez à travers eux que vous faites la fusion dans votre tête. Puis traduisez votre processus de décision mentale en un algorithme et ensuite code.

la solution optimale fait un seul passage à travers les deux listes.

4
répondu Stephen C 2012-03-29 01:09:51

Java 8 Stream API peut être utilisé pour le but,

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()hashCode().

4
répondu snr 2017-06-16 15:26:47

Ajouter des éléments dans la première 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 arraylist

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

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

Ajouter une première liste de tableaux d'éléments en deuxième arraylist

secondArrayList.addAll(firstArrayList);

Attribuer de nouvelles combiner liste de tableaux et d'ajouter tous les éléments des deux arraylists

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

Assigner un nouveau Jeu pour supprimer des entrées en double dans arraylist

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

Tri des arraylist

Collections.sort(comboArrayList);

Sortie

 A
 B
 C
 D
 E
 F
 G
3
répondu Hiren Patel 2015-05-05 05:18:16

votre second pour loop devrait avoir j++ au lieu de i++

2
répondu Chetter Hummin 2012-03-29 01:03:20

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 fonctionne O(N-au carré). Envisagez de pré-trier vos tableaux d'entrées (s'ils ne sont pas définis pour être 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
répondu Eric J. 2012-03-29 01:05:59

votre for imbriquées boucle

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

est infini car j sera toujours égal à zéro, d'un autre côté, je serai augmenté à volonté dans cette boucle. Vous obtenez une exception quand je suis plus grand que plusArray.taille()

1
répondu Southeast 2012-03-29 01:16:02

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
répondu nxhoaf 2018-04-03 11:48:22
**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
répondu Ashish Agrawal Yodlee 2016-02-07 11:14:07

j'ai compris que vous ne voulez pas utiliser les fonctions intégrées pour fusionner ou supprimer les doublons de la liste des tableaux. Votre premier code est en cours d'exécution pour toujours parce que l'extérieur pour la condition de boucle est 'toujours vrai'. Puisque vous ajoutez des éléments à plusArray, ainsi la taille de la plusArray augmente avec chaque ajout et donc ' i ' est toujours moins qu'elle. En conséquence, la condition n'échoue jamais et le programme court pour toujours. Astuce: essayez d'abord de fusionner la liste et ensuite à partir de la liste fusionnée supprimer les doublons éléments. :)

0
répondu Rinks 2017-08-12 10:06:04

Vous n'avez pas à handcode. La définition du problème est précisément le comportement d'Apache Commons CollectionUtils#collate. Il est également surchargé pour différents ordres de tri et permettant des doublons.

-1
répondu Noumenon 2015-11-07 03:44:47