2017-01-25 4 views
1

Ich schreibe gerade ein Java-Programm, das Werte in eine AreaChart anzeigt, und dazu habe ich eine ArrayList mit dem Namen dataList vom generischen Typ AreaChartPair.Java - wie man diesen repetitiven Code vermeidet

Jede AreaChartPair enthält einen X-Achsen (String) Wert und einen Y-Achsen (Integer) Wert.

Die X-Achse sind Daten und die Y-Achse ist ein Zähler und da alle Daten aus einer Datei gelesen werden, sind die Daten in einer unsortierten Reihenfolge. sie sortieren Ich benutze diese Funktion:

dataList.sort(Comparator.comparing(AreaChartPair::getXAxisStringValue));

, die nicht vollständig mein Problem zu lösen ist, da es nur die ersten alphanumerischen Zeichen vergleichen (dh 02.09.2030 würde nach 01.01.2000, weil 02 nach 01 kommt)

um dieses Problem zu lösen, habe ich einfach das Datum yyyy.mm.dd von dd.mm.yyyy umgekehrt, sortiert die Liste mit der Funktion oben und umgekehrt danach die Zeichenfolge zurück zu dd.mm.yyyy

Jetzt

Meine Frage ist, wie ich diesen Block von Code vereinfachen kann, da es sich wiederholt:

//replaces the current data with the reversed string 
for (int index = 0; index < dataList.size(); index++) { 
    dataList.set(index, new AreaChartPair(model.reverseDate(dataList.get(index).getXAxisStringValue()), 
     dataList.get(index).getYAxisIntegerValue())); 
} 

//sorts the data 
dataList.sort(Comparator.comparing(AreaChartPair::getXAxisStringValue)); 

//reverses the string back to normal, so it can be displayed 
for (int index = 0; index < dataList.size(); index++) { 
    dataList.set(index, new AreaChartPair(model.reverseDate(dataList.get(index).getXAxisStringValue()), 
     dataList.get(index).getYAxisIntegerValue())); 
} 

Irgendwelche Vorschläge?

+0

Erstellen Sie einen benutzerdefinierten Komparator, der den umgekehrten Vergleich durchführt? – RobAu

Antwort

5

Ein kürzerer Weg zur Durchführung der Sortierung besteht darin, das Reversieren im laufenden Betrieb durchzuführen. Die Zeichenfolge könnte auch zu einem echten Datumsobjekt geparst werden, um es sauberer zu machen, aber das erfordert catch-Blöcke und dateformatter-Objekte, so dass ich diesen Code hier nicht schreibe.

dataList.sort(Comparator.comparing(AreaChartPair::getXAxisStringValue, 
    (a, b) -> { 
     return model.reverseDate(a).compareTo(model.reverseDate(b)); 
})); 
+0

funktioniert wie ein Charme :) aber ich denke, Sie haben vielleicht eine schließende Klammer am Ende vergessen –

+1

Das war nur um zu überprüfen, ob Sie es waren aufpassen ;) – Kayaman

1

Vielleicht ein Verfahren daraus machen:

AreaChartPair areaChartPair = new AreaChartPair(model.reverseDate(dataList.get(index).getXAxisStringValue()), 
      dataList.get(index).getYAxisIntegerValue()); 
public DataListType dataListSorter(DataListType datalist, AreaChartPair areaChartPair) { 
    for (int index = 0; index < dataList.size(); index++) { 
     dataList.set(index, areaChartPair); 
    } 
return dataList; 
} 

dataList = dataListSorter(dataList); 
dataList.sort(Comparator.comparing(AreaChartPair::getXAxisStringValue)); 
dataList = dataListSorter(dataList); 

Noch repetitive, though. Wahrscheinlich am nützlichsten, um es auf diese Weise zu tun, wenn Sie dies während Ihrer gesamten Anwendung immer und immer wieder tun werden.

+0

Dies könnte eine gültige Lösung für mein Problem sein. Das einzige Problem für mich wäre diese Zeile: '.set (index, new AreaChartPair (...)' da die neue AreaChartPair (...) hart codiert wäre, gibt es eine Möglichkeit, diese dynamischer zu machen? Ich schon versuchte, einen 'Object'-Typ zu der Methode zu parametrisieren, aber konnte keine neue Klasseninstanz erzeugen –

Verwandte Themen