# String Array mit Datum und Uhrzeit String sortieren



## Bluedaishi (3. Dez 2013)

Hallo alle zusammen,

ich habe folgendes Problem,

ich habe ein String Array mit folgenden Strings

17.02.13 22:33
12.02.13 18:31
16.02.13 03:33 
13.02.13 17:21
.
.
.
 usw

da die Uhrzeiten teilweise verändert werden müssen sie nach datum und uhrzeit wieder in reihenfolge 
sortiert werden

zb

12.02.13 18:45
12.02.13 19:36
13.02.13 17:26
16.02.13 03:33
17.02.13 22:33

kann mir da vielleicht jemand weiter helfen :bahnhof::bahnhof:;(;(;(;(;(;(


----------



## rme (3. Dez 2013)

Hm. Entweder in eine Date-Instanz parsen, aber das ist vermutlich nur wenig aufwändiger als:

* String an " " In Datum und Zeit zerlen
* Datum an "." splitten und nach den 3 Spalten sortieren, d.h. zuerst Jahr, dann Monat, dann Tag
* Uhrzeit in 2 Spalten trennen und vorwärts sortieren, d.h. zuerst Stunde, dann Minute
* beide Kriterien verbinden, sodass erst nach Datum und dann nach Zeit sortiert wird (bei Übereinstimmung des Datums)


----------



## eRaaaa (3. Dez 2013)

Arrays.sort mit eigenem Comparator


```
final SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy HH:mm");
		Arrays.sort(deinArray, new Comparator<String>() {
			@Override
			public int compare(String date1, String date2) {
				try {
					return format.parse(date1).compareTo(format.parse(date2));
				} catch (ParseException e) {
					e.printStackTrace();
				}
				return 0;
			}
		});
```

Was mir natürlich auch die Frage stellt wieso du nicht gleich ein Date/Time Objekt verwendest und eher bei der Ausgabe später, falls erforderlich, in den entsprechenden String formatierst...


----------



## Bluedaishi (3. Dez 2013)

Guten Morgen,
Erst einmal vielen Dank für eure Hilfe 

Ich lese diese Zeilen aus einem Text in
ein String Array da ich nicht weiß wieviele Zeilen kommen
Dann gehe ich mit einer for schleife über das Array
und kontrolliere die Uhrzeiten denn die müssen
Teilweise verändert werden sind diese geändert schiebe
ich diese neuen Strings in ein neues Array dort 
Sollen sie dann sortiert werden und dann wieder zurück
In die text Datei .... So ist der plan leider klappt das nicht immer
100 prozentig zuverlässig 

Schreibe gerade von meinem iphone werde
den Quelltext nach schieben


:rtfm:


----------



## Lonsdaleit (3. Dez 2013)

Ich würde über SimpleDateFormat ein Datum aus dem String machen und anschließend mit den Methoden after() und before() jeweils zwei Daten aus dem Array vergleichen.

Wenn du keine sehr großen Mengen an Daten hast und sich die Sortierung nicht stark verändert, empfehle ich dir "BubbleSort" zu nutzen.
Hierbei vergleichst du immer zwei benachbarte Elemente.
Dadurch wandert in jedem durchlauf das größte/kleinste Element "nach oben" - es "blubbert nach oben".

Du musst folglich in einer doppelten For-Schleife (die eine vorwärtslaufend, die andere rückwärts laufend) immer die beiden benachbarten Elemente vergleichen und ggf vertauschen.

Willst du das ganze schneller haben - wenn etwa der Fall, dass keine Sortierung nötig ist häufiger Auftritt - kannst du auch eine do-while-Schleife und eine for-Schleife nutzen und ein Abbruchkriterium einfügen, falls kein Vertauschen stattfand.


Dadurch sortierst du dein Array als Datum.

Anschließend kannst du daraus wieder einen String machen.

Gruß


----------



## Bluedaishi (5. Dez 2013)

Guten Morgen alle zusammen :bae:

mein bis jetziger lösungsansatz sah so aus der aber nicht hundert prozentig funktioniert ;(


```
for (int a = 0 ; a < DatumTAG.length; a++){
			
									Line = DatumTAG[a];
								
									NStunde = Line.substring(9, 11);
									int_NStunde = Integer.parseInt(NStunde);
								
							if((int_NStunde >= 3)&(int_NStunde <= 11)){	
								
									NStunde = NStunde.replace("0", "1");
									Zeit_neu = Line.replace(Line.substring(9, 11),  NStunde);
              
                                                                        DatumTAGneu[a] = Zeit_neu;
							}else{
                                                            
                                                            DatumTAGneu[a] = Line;
                                                           
                                                        }
                                                    }

                                                       
                                                        
                                                    Arrays.sort(DatumTAGneu); 
                                                    for (String string : DatumTAGneu) {
                                                         
                                                    }
```


das errgebnis :

01.11.13 22:17 AN
01.11.13 22:19 AN
01.11.13 22:21 AN
01.11.13 22:32 AN
01.11.13 23:17 AN
01.11.13 23:18 AN
01.11.13 23:21 AN
01.11.13 23:21 AN
01.12.13 00:07 AN
01.12.13 00:23 AN
01.12.13 02:10 AUS <---- Aus muss immer an die letze stelle also unten stehen 
02.11.13 00:00 AN           
04.11.13 14:46 AN
08.11.13 02:10 AN
09.11.13 22:01 AN
30.11.13 23:38 AN


ich weiss nicht aber nach datum und uhr zeit ist das nicht wirklich sortiert eher nach den stellen des Strings

hat vielleicht jemand eine andere lösung

:toll::toll::toll::toll::toll::toll::toll::toll:


----------



## anti-held (5. Dez 2013)

Wie es eRaaaa so schön mit einem Comparator gelöst hat,
würde ich es auch machen.
Hab hier zu seinem Comparator noch den Vergleich der AN und AUS Strings hinzugefügt:


```
final SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy HH:mm");
		Arrays.sort(deinArray, new Comparator<String>() {
			public int compare(String string1, String string2) {
				try {
					String rest1 = string1.substring(15);
					String rest2 = string2.substring(15);
					int comp1 = rest1.compareTo(rest2);
					if (comp1 == 0) {
						Date date1 = format.parse(string1.substring(0, 14));
						Date date2 = format.parse(string2.substring(0, 14));
						return date1.compareTo(date2);
					} else {
						return comp1;
					}
				} catch (ParseException e) {
					e.printStackTrace();
				}
				return 0;
			}
		});
```


----------

