2016-03-29 1 views
0

Ich versuche, eine ArrayList zu generieren, indem ich zwei andere Listen zusammenführe. Ich bin erlaubt, doppelte Objekte, aber meine resultierende ArrayList muss den Unterschied zwischen beiden ursprünglichen Listen enthalten. Ich weiß, das kann gewunden klingen, so ist hier ein Beispiel:Zusammenführen von zwei Java-Arraylists mit Duplikaten

Arraylist 1: [obj1, obj1, obj1, obj2, OBJ4, OBJ4]
Arraylist 2: [obj1, obj2, obj2, obj3

]

Resultierende Arraylist: [obj1, obj1, obj2, obj3, OBJ4, OBJ4]

ich so fühlen sollte einfach sein, aber ich kann nicht scheinen, um es herauszufinden. Ich würde ArrayList1.removeAll (ArrayList2) verwenden, aber jedes Objekt hat seine eigene individuelle ID, also glaube ich nicht, dass ich feststellen würde, dass sie das gleiche Objekt sind.

BEARBEITEN: ein Fehler in meiner resultierenden ArrayList behoben
Danke!

+3

Das klingt viel wie eine Hausaufgabe Frage. Wenn du Probleme mit deinen Hausaufgaben hast, solltest du dich an Lehrer/Professor/Schülerhilfe/etc. Dafür werden sie bezahlt. – forgivenson

+1

Haben Sie schon etwas probiert? –

+1

HInt: Diese Aufgabe ist es, Sie Schleifen und Gegen Fähigkeiten zu testen :) –

Antwort

1

einfach eine hashmap verwenden, Zuordnen eines Elements auf die Anzahl der Male ist es in liste1 aufgetreten ist, und ein anderes für hashmap list2, dann eine neue Array machen und fügen objx n-mal, wobei n = abs (hashmap1.get (objx) - hashmap2.get (objx)).

import java.util.*; 
import java.lang.*; 
import java.io.*; 

public class Main 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     List<Integer> list1 = Arrays.asList(new Integer[] { 1, 1, 1, 2, 4, 4 }); 
     List<Integer> list2 = Arrays.asList(new Integer[] { 1, 2, 2, 3 }); 
     HashMap<Integer, Integer> hashMap1 = new HashMap<>(); 
     HashMap<Integer, Integer> hashMap2 = new HashMap<>(); 
     for (Integer i : list1) { 
      if (hashMap1.containsKey(i)) { 
       hashMap1.put(i, hashMap1.get(i) + 1); 
      } else { 
       hashMap1.put(i, 1); 
      } 
     } 
     for (Integer i : list2) { 
      if (hashMap2.containsKey(i)) { 
       hashMap2.put(i, hashMap2.get(i) + 1); 
      } else { 
       hashMap2.put(i, 1); 
      } 
     } 
     HashSet<Integer> dedup = new HashSet<>(); 
     for (Integer i : list1) { 
      dedup.add(i); 
     } 
     for (Integer i : list2) { 
      dedup.add(i); 
     } 
     ArrayList<Integer> result = new ArrayList<>(); 
     for (Integer i : dedup) { 
      Integer n1 = hashMap1.get(i); 
      Integer n2 = hashMap2.get(i); 
      int n = Math.abs((n1 == null ? 0 : n1) - (n2 == null ? 0 : n2)); 
      for (int j = 0; j < n; ++j) { 
       result.add(i); 
      } 
     } 
     for (Integer i : result) { 
      System.out.println(i); 
     } 
    } 
} 
+0

Das hat perfekt funktioniert! Danke :) –

+0

OK, das scheint zu sein, was der Fragesteller gesucht hat ... Nun, zwei kleine Bemerkungen: Der Inhalt der ersten 'for' - Schleifen kann präziser als' hashMap.merge (i, 1, Integer :: sum); ', und die zweiten können durch Aufrufe von' dedup.addAll (list); 'ersetzt werden. – Marco13

+0

@ Marco13 danke. Sie können bearbeiten, wenn Sie wollen, ich kenne java8 noch nicht. – Pavel