2014-10-23 14 views
5

ich eine Liste von Daten in einer txt-Datei wie dieseSortieren Java String-Array von mehreren Zahlen

Date,Lat,Lon,Depth,Mag 

20000101,34.6920,-116.3550,12.30,1.21 
20000101,34.4420,-116.2280,7.32,1.01 
20000101,37.4172,-121.7667,5.88,1.14 
20000101,-41.1300,174.7600,27.00,1.90 
20000101,37.6392,-119.0482,2.40,1.03 
20000101,32.1790,-115.0730,6.00,2.44 
20000101,59.7753,-152.2192,86.34,1.48 
20000101,34.5230,-116.2410,11.63,1.61 
20000101,59.5369,-153.1360,100.15,1.62 
20000101,44.7357,-110.7932,4.96,2.20 
20000101,34.6320,-116.2950,9.00,1.73 
20000101,44.7370,-110.7938,5.32,1.75 
20000101,35.7040,-117.6320,4.15,1.45 
20000101,41.9270,20.5430,10.00,4.80 

meiner Aufgabe ist es, diese Daten von jedem Kriterium ex) Sortierung nach Datum, Breite zu sortieren und Longtitude

ich versuchte Blase Art wie diese

if (Double.parseDouble(a[0].split(",")[1]) < Double.parseDouble(a[1].split(",")[1])) 

dies funktioniert aber nimmt zu viel Zeit

theres 40000 Daten in der TXT-Datei

Gibt es eine alternative Möglichkeit, diese Daten zu sortieren?

+4

Speichern Sie jede Zeile in einem Klassenobjekt und definieren Sie dann verschiedene Vergleicher für die Liste dieses Klassenobjekts. Verwenden Sie dies als Referenz http://StackOverflow.com/Questions/5245093/using-comparator-to-make-custom-sort – StackFlowed

+3

Wie wäre es mit merge sort? O (nlogn) –

Antwort

0

ich wahrscheinlich einige Schüler Hausaufgaben zu ruinieren, aber hier geht ...

Wie auf der Frage vorgeschlagen, ist die natürliche Art und Weise in Java eine Klasse zu erstellen, um Ihre Daten zu repräsentieren. Implementieren Sie dann eine Comparator, die an die Dienstprogrammmethode übergeben werden soll.

Auf meinem MacBook Pro 2,3 GHz Intel Core i7 läuft eine Parallels virtuelle Maschine mit Java 8, ein Datensatz von 42.000 Elementen dauert zwischen 45-90 Millisekunden zum Sortieren.

Ich habe Ihre Beispieldaten geändert, um interessanter zu sein, einige unterschiedliche Daten und doppelte Breiten einzuführen.

20000101,34.6920,-116.3550,12.30,1.21 
20000101,34.4420,-116.2280,7.32,1.01 
20000101,34.6920,-121.7667,5.88,1.14 
20000101,-41.1300,174.7600,27.00,1.90 
20000101,37.6392,-119.0482,2.40,1.03 
20000101,32.1790,-115.0730,6.00,2.44 
20000101,34.6920,-152.2192,86.34,1.48 
20000102,34.6320,-116.2410,11.63,1.61 
20000102,59.5369,-153.1360,100.15,1.62 
20000102,44.7357,-110.7932,4.96,2.20 
20000102,34.6320,-116.2950,9.00,1.73 
20000102,34.6320,-110.7938,5.32,1.75 
20000102,34.6320,-117.6320,4.15,1.45 
20000102,41.9270,20.5430,10.00,4.80 

Meine GeoReading Klasse, um die Daten darzustellen.

Hier ist die Comparator-Implementierung.

class GeoReadingAscendingComparator implements Comparator<GeoReading> 
{ 

    @Override 
    public int compare(GeoReading o1 , GeoReading o2) 
    { 
     int localDateCompare = o1.localDate.compareTo(o2.localDate); 
     if (localDateCompare != 0) { // If not equal on this component, so compare on this. 
      return localDateCompare; 
     } 

     int latitudeCompare = o1.latitude.compareTo(o2.latitude); 
     if (latitudeCompare != 0) { // If not equal on this component, so compare on this. 
      return latitudeCompare; 
     } 

     return o1.longitude.compareTo(o2.longitude); 

    } 
} 

Hauptcode.

In der realen Welt würde ich etwas defensiven Programmiercode hinzufügen, um die eingehenden Daten zu überprüfen. Daten von externen Quellen sind immer defekt und/oder ändern.

+0

Warum die BigXXX Felder? Warum nicht Doppel und Ints? – user949300

+1

@ user949300 ** Genauigkeit> Leistung. ** Ich habe eine Angewohnheit, [BigDecimal] (http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html) in meiner üblichen Weise zu verwenden Projekte, die mit Geld arbeiten und solche, bei denen Genauigkeit gefragt ist. Wenn diese wissenschaftlichen Daten die Ungenauigkeit der Gleitkommadrift tolerieren könnten, dann gehen Sie darauf ein.Könnte schneller sein, aber für eine Gesamtlaufzeit von weniger als einer Sekunde würde ich das [vorzeitige Optimierung] (http://en.wikipedia.org/wiki/Programm_optimierung) berücksichtigen. –

+0

OP hat 40K Datensätze, jeweils 5 Felder, also BigXXX ist 200K Objekte. Ein Objekt ist grob gesagt 10 zusätzliche Bytes über einem Primitiv, also 2 MB. Was, denke ich, heutzutage nicht viel ist, aber es ist etwas. – user949300

5

Versuchen Sie eine merge sort. Merge sort hat eine Worst-Case-Performance von O (n log n). Die Worst-Case-Zeit der Bubble-Sorte ist O (n^2).

+2

und wenn Sie nicht wissen, was diese Notation bedeutet, ist es Big Oh Notation. O (nlogn) ist besser als O (n^2), was bedeutet, dass Merge Sort im schlimmsten Fall viel besser funktioniert als Bubble Sort. Sehen Sie hier für mehr: http://en.wikipedia.org/wiki/Big_O_notation#Orders_of_common_functions (das wird für Sie vorwärts wichtig sein). – muttley91

+0

krank versuchen danke! – LookInsideThe