2016-04-20 23 views
1
public class Sorting<T>{ 
    private Comparator <T> genericComparator; 
    public ArrayList<T> array; 

    public Sorting (Comparator<T> TypeComparator) { 
    this.genericComparator= TypeComparator; 
    } 

    void MergeSort(int low, int high){ 
     if (low < high) { 
      int mid = (low + high)/2; 
      MergeSort(low, mid); 
      MergeSort(mid + 1, high); 
      Merge(low, mid, high); 
     } 
    } 

    void Merge(int low, int mid, int high) {  
     ArrayList<T> b = new ArrayList <T>(); 
     int h = low, i = low, j = mid+1, k; 

     while ((h <= mid) && (j <= high)) { 
      if (genericComparator.compare(array.get(h), array.get(j))<=0) { 
       b.set(i, array.get(h)); h++; } 
      else { b.set(i, array.get(j)); j++; } 
        i++; 
     } 

     if (h > mid) { 
      for (k=j; k<=high; k++) { 
       b.set(i, array.get(k)); i++; } 
     } 
     else { 
      for (k=h; k<=mid; k++) { 
       b.set(i, array.get(k)); i++; 
      } 
     } 
     for (k=low; k<=high; k++) 
        array.set(k, b.get(k)); 
    } 

Hallo, ich habe dieses generische MergeSort geschrieben, aber es gibt mir immer "ArrayList rangecheck error".Generic MergeSort

PS: dies ist der Vergleicher:

public class StringComparator implements Comparator<String> { 

    @Override 
    public int compare(String o1, String o2) { 

     return o1.compareTo(o2); 

    } 
} 

Und das ist die Haupt i verwendet:

public class prova { 

     public static void main(String[] args) {  

     ArrayList<String> string = new ArrayList <String>(); 
     string.add("Alberto"); 
     string.add("Ermanno"); 
     string.add("Francesco"); 
     string.add("Carlo"); 
     string.add("Betta"); 
     string.add("Herald"); 
     string.add("Daniela"); 
     string.add("Giotto"); 

     Sorting<String> sisi = new Sorting<String> (new StringComparator()); 

     sisi.array = string; 
     System.out.println (sisi.array); 
     sisi.MergeSort(0, sisi.array.size()-1); 
     System.out.println (sisi.array); 

     } 

    } 

Könnten Sie bitte mit ihm, was falsch zu verstehen helfen?

+0

Können Sie den Fehler Stacktrace posten und angeben, wo in Ihrem Code der Fehler herkommt? – cyroxis

+0

Ausnahme im Thread "Haupt" [Alberto, Ermanno, Francesco, Carlo, Betta, Herald, Daniela, Giotto] java.lang.IndexOutOfBoundsException: Index: 0, Größe: 0 \t bei java.util.ArrayList.rangeCheck (unbekannt Source) \t bei java.util.ArrayList.set (Unknown Source) \t bei Sort.Sorting.Merge (Sorting.java:107) \t bei Sort.Sorting.MergeSort (Sorting.java:92) \t in Sort .Sorting.MergeSort (Sorting.java:89) \t bei Sort.Sorting.MergeSort (Sorting.java:89) \t bei Sort.prova.main (prova.java:37) Sorry, b ut Fehler Zeilen sind falsch (ich habe andere generische Sortiermethoden in meinem Haupt) – user3004162

Antwort

0

In Ihrer Merge-Funktion erstellen Sie eine neue Arraylist und weisen Sie ihn b:

ArrayList<T> b = new ArrayList <T>(); 

Sie nie etwas tun, es über die Größe von 0 bis zu wachsen, so dass jeder der b.set(... Anrufe, die Sie führt zu tun in dieser Ausnahme.

+0

Aber .. es funktioniert mit anderen Sortieren (wie InsertionSort oder QuickSort). Ich denke, Größe ist eine Methode von Arraylist, die die Anzahl der Elemente zurückgibt und die ich nicht erhöhen muss (da ich die Länge eines Arrays nicht vergrößern). Korrigieren Sie mich, wenn ich falsch liege! – user3004162

+0

In der Javadoc für 'List.set()' heißt es "wirft: IndexOutOfBoundsException - wenn der Index außerhalb des Bereichs ist (Index <0 || Index> = Größe())" Wenn es nichts in der Liste, erhalten() wird immer werfen. Beachten Sie, dass eine ArrayList kein Array ist. In einem Array können Sie Werte in einen beliebigen Index stopfen, aber in einer ArrayList sind Sie an die aktuelle Listengröße gebunden. –

+0

Sie könnten ein T [] - Array anstelle einer Liste verwenden, um die sortierten Ergebnisse zu sammeln. –