2017-12-05 8 views
0

Was ich tun muss, ist eine Datei nehmen, die ein Namensfeld enthalten würde und dann auch Daten mit ihnen haben und sie basierend auf einer bestimmten Zahl sortieren, die eine bestimmte Menge dieser Daten darstellt. Hier ist eine Beispieltextdatei. Dies wäre wie Städte und ihre Durchschnittstemperatur für jeden Monat (nicht wirklich genau).Generische Auswahl Sortierung, die Objektfelder überprüfen kann

NewYork: 35, 28, 99, 39, 3, 15, 52, 5, 6, 97, 36, 32 
Baltimore: 1, 59, 55, 0, 92, 82, 23, 60, 23, 16, 75, 75 
Seattle: 19, 18, 10, 36, 50, 2, 8, 36, 56, 86, 14, 91 
Atlanta: 57, 75, 52, 66, 28, 58, 53, 5, 21, 30, 81, 58 

Ich möchte in der Lage sein, diese auf einem bestimmten Datenpunkt zu sortieren, so dass, wenn 2 ausgewählt wurde sollte es durch den zweiten Punkt in aufsteigender Reihenfolge sortiert werden, so dass es so aussehen würde. Die tatsächlichen Daten für jede Stadt werden nicht sortiert, der gesamte Datensatz wird basierend auf dem verwendeten Datenpunkt entweder nach oben oder nach unten verschoben.

Seattle: 19, 18, 10, 36, 50, 2, 8, 36, 56, 86, 14, 91 
NewYork: 35, 28, 99, 39, 3, 15, 52, 5, 6, 97, 36, 32 
Baltimore: 1, 59, 55, 0, 92, 82, 23, 60, 23, 16, 75, 75 
Atlanta: 57, 75, 52, 66, 28, 58, 53, 5, 21, 30, 81, 58 
      ^
      This is the second data point row that was sorted. 

Hier ist, was die SelectionSort Klasse sucht wie, und ich bekommen konnte es ohne Generika zu arbeiten, aber ich möchte in der Lage sein, Generika zu verwenden.

Dann für die tatsächlichen Objekte habe ich dies, wo die Eingabe in den Konstruktor ist einfach eine ganze Zeile aus der Textdatei. Dann helfen das Daten-Handle und der Name-Handle, den String aufzuteilen und den Namen auf den Namen aus der Textdatei zu setzen, und setzen die Arraylist auf alle Nummern, die der Name hatte.

public class ObjectData<T> { 
private ArrayList<Integer> list; 
private String name; 



public ObjectData(String objectInfo){ 

    String array[] = allData(objectInfo); 
    this.name = nameHandle(array[0]); 
    list = new ArrayList<Integer>(Arrays.asList(dataHandle(array[1]))); 
} 



private static String[] allData(String string){ 

    String array[] = string.split(":"); 


    return array; 

} 

private static String nameHandle(String string){ 
    String name = string.trim(); 

    return name; 

} 

private Integer[] dataHandle(String string){ 
    String array[] = string.split(","); 
    String trimmedArray[] = new String[array.length]; 
    Integer integerArray[] = new Integer[trimmedArray.length]; 

    for (int i = 0; i < array.length; i++){ 
     trimmedArray[i] = array[i].trim(); 
    } 

    for (int i = 0; i < trimmedArray.length; i++){ 
     integerArray[i] = Integer.valueOf(trimmedArray[i]); 
    } 


    return integerArray; 
} 



public String getName(){ 

    return this.name; 

} 


public Integer getIndex(int index){ 


    return list.get(index); 

} 

}

In Haupt alle Objekte werden in eine Arraylist setzen, und das wäre das Arraylist mit Objekten, die dann in die SelectionSort Klasse inputed wird. Das Problem, das ich habe, ist herauszufinden, wie man die generische Auswahl mit einem Objekt wie diesem sortiert. Ich hatte geplant, nur zum Beispiel anzurufen, wenn der Schlüssel 2 wie oben war. Ich würde

if(arrayList.get(smallestIndex).getIndex(2).compareTo((arrayList.get(smallestIndex).getIndex(2))) > 0 )

statt if(arrayList.get(smallestIndex).compareTo((arrayList.get(j))) > 0 )

Der einzige andere Weg nenne ich darüber nachdachte der Lage, dies war statt zu tun, Erstellen von Objekten Ich möchte nur alle stellen Informationen in ein 2D-Array und dann in der Lage sein, sie zu vergleichen, aber dann verliere ich den Namen für die Daten. Wenn jemand vorschlagen kann, wie ich das ändern soll, damit es funktioniert, oder eine völlig andere Art, dies zu erreichen, wäre das großartig.

Antwort

1

Eine Möglichkeit Sie sich anschauen sollten schafft ein Objekt, das die Comparator-Schnittstelle implementiert und führt den Index als Parameter zu sortieren:

public class DataComparator implements Comparator<ObjectData>{ 
    private int sortIndex; 

    public DataComparator(int sortIndex){ 
     this.sortIndex = sortIndex; 
    } 

    public int compare(ObjectData t1, ObjectData t2) { 
     return (t1.getIndex(sortIndex) < t2.getDataIndex(sortIndex)) ? -1 : 1; 
    } 
} 

Wenn Sie dann eine List<ObjectData> Ihrer Städte haben, nennen wir es cityList Zum Beispiel können Sie es mit Collections.sort(cityList, new DataComparator(2)) sortieren.

+0

In Ordnung, ich denke ich verstehe, außer wie würde ich dann den DataComparator in der Collections.sort-Methode verwenden? Muss ich nicht eine neue Sortiermethode korrigieren, die die Compare-Methode des DataComparators verwendet? Was wiederum dazu führen würde, dass es keine Generika verwenden könnte. –

+0

'Collections.sort()' verwendet bereits den 'Comparator', den Sie übergeben. Sie müssen nur eine Instanz davon erstellen, die mit dem gewünschten Index sortiert, und diese Instanz an 'Collections.sort()' übergeben, genau wie im Beispiel am Ende. – Kirill

+0

Danke für die Hilfe übrigens. Nur wundernd, würde nicht der zweite Parameter für die Sortiermethode geändert werden müssen, um ein Objekt zu akzeptieren? Auch verwirrt, da ich compareTo in der Sortiermethode verwende und was Sie zeigen, wenn Sie Comparator implementieren, zeigt eine Vergleichsmethode eher als eine compareTo. –