2016-04-14 6 views
1

Wie kann ich zwei lexikographisch geordnete String ArrayLists in eine neue dritte ArrayList zusammenführen, ohne die beiden ursprünglichen Listen zu ändern? Duplikate sind zum Beispiel erlaubt. Wenn list1 ist: 1, 3, 5 und list2 ist: 2, 4, 7, 8, 8. Dann sollte die neue zusammengeführte list3 sein: 1, 2, 3, 4, 5, 7, 8, 8. Ich muss Erstellen Sie 2 While-Loops, wobei der erste bis zu einer ganzen Liste weiterläuft und der zweite die Reste aus der anderen Liste übernimmt und alle übrig gebliebenen Elemente am Ende der neuen Liste platziert3. Ich muss im Grunde beide Listen-Indizes vergleichen, um zu sehen, welches Element voranschreitet. Alles sollte korrekt sein, aber ich brauche Hilfe beim Erstellen der While-Schleifen.Wie kann ich zwei lexikographisch geordnete String ArrayLists in eine neue dritte ArrayList zusammenführen?

Sorry für die lange Beschreibung, aber ich stimme jedem, der hilft! Vielen Dank!

public class Merge{ 
    public static boolean isStringArrayListSorted(ArrayList<String> data) { 
     for (int i = 1; i < data.size(); i++) { 
      if (data.get(i - 1).compareTo(data.get(i)) > 0) { 
       return false; 
      } 
     } 
     return true; 
    } 

    public Merge (ArrayList<String> list1, ArrayList<String> list2){ 

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

    list1.add(0, "a"); 
    list1.add(1, "c"); 
    list1.add(2, "e"); 
    list1.add(3, "g"); 

    list2.add(0, "b"); 
    list2.add(1, "d"); 
    list2.add(2, "f"); 
    list2.add(3, "h"); 
    list2.add(4, "i"); 
    list2.add(5, "j"); 

    while(list1!= null){ 
     if(list1.get(0)> list2.get(0)) 
     { 
      list3.add(index, element); 
     } 
    } 
} 
+0

FYI, müssen Sie die Indizes in Ihrer Liste nicht benötigen() Aufrufe, die einzelnen Argument add() -Methoden hängt an das Ende. – Roman

Antwort

2

Angenommen, Sie die beiden und sortieren eine Zusammenführung wollen, anstatt zu kombinieren wirklich wieder tun, es ist ein einfaches merge Code wie folgt:

public static ArrayList<String> merge(ArrayList<String> L1, ArrayList<String> L2) { 
    int i1 = 0, i2 = 0; 
    ArrayList<String> result = new ArrayList<String>(); 

    while (i1 < L1.size() && i2 < L2.size()) { 
     if (L1.get(i1).compareTo(L2.get(i2)) < 0) { 
      result.add(L1.get(i1)); 
      i1++; 
     } else { 
      result.add(L2.get(i2)); 
      i2++; 
     } 
    } 

    while (i1 < L1.size()) { 
     result.add(L1.get(i1)); 
     i1++; 
    } 

    while (i2 < L2.size()) { 
     result.add(L2.get(i2)); 
     i2++; 
    } 

    return result; 
} 
+0

ArrayList, die AbstractList implementiert ermöglicht zufälligen Zugriff auf die Elemente in der Mitte, während LinkedList implementiert AbstractSequentialList (die AbstractList erweitert) nur einen zusätzlichen "sequenziellen Zugriff" nur auferlegen. In meinem Code habe ich Einträge in der Mitte nicht manipuliert, daher behält die ArrayList die Reihenfolge bei. –

2

Warum nicht Collections.sort() verwenden?

ArrayList<String> list3 = new ArrayList<String>(list1); 
list3.addAll(list2); 
Collections.sort(list3); 
+0

Nun möchte ich einen Algorithmus erstellen, um dies mit while-Schleifen zu tun, indem Sie Indizes vergleichen, um zu bestimmen, welches Element in die neue Liste vorrückt. – MercedezB

+0

Heutzutage sind CPUs sehr schnell, so dass eine O (n log n) -Sortierung im Vergleich zu einer O (n) -Mischung nicht wichtig ist [mit der Annahme, dass es keine Kosten für den Erhalt der anfänglichen sortierten Liste gibt]. So ...^_^ –

1

Ich würde vorschlagen, hier Collections.sort () zu verwenden. Erstellen Sie einfach eine neue Liste, fügen Sie alle Elemente hinzu und sortieren Sie sie. Der Chode wäre kürzer, besser lesbar und Sie würden den in den Sortieralgorithmus integrierten, hochpräformierten Algorithmus verwenden.

Verwandte Themen