# Zahlen in Strings einer ArrayList sortieren



## noobadix (27. Feb 2010)

Holla,

wie kann ich in einer ArrayList, die Strings enthält, die Zahlenwerte sortieren?

Collections.sort(List,Comparator) hilft nur bedingt, denn die 10 folgt der 1 und das ist nicht gewünscht.

Wie also mache ich aus 1, 10, 12, 2, 3, 4, 40, 5 folgende Sortierung: 1,2,3,4,5,10,12,40 ?

Muss ich jetzt lernen wie man einen eigenen Comparator schreibt oder geht's einfacher?

Danke vorab, N.


----------



## Atze (27. Feb 2010)

vielleicht als integer sortieren, und nacher wieder in string konvertieren


----------



## noobadix (27. Feb 2010)

Ja, funktioniert. Hier mein Entwurf, hat jemand Optimierungsvorschläge?

Der Lektionsname einer Vokabel kann ein Name oder eine Nummer und doppelt, jedenfalls in Form eines String sein; die Methode soll eine Liste der verfügbaren Lektionen in einem Vokabular (Vokabel[] vcb) liefern.


```
...

public String[] getLections(){
    if(vcb!=null){
        ArrayList<String> tmp_vector = new ArrayList<String>();
        ArrayList<Integer> tmpVectorNumbers = new ArrayList<Integer>();
        for(int i=0;i<vcb.length;i++){
            String tmpLec = vcb[i].getLection(); //Name oder Nummer
            try{//Namen von Nummerangaben trennen
                Integer in = Integer.parseInt(tmpLec);
                if(!tmpVectorNumbers.contains(in))tmpVectorNumbers.add(in);
             }
             catch(Exception e) tmp_vector.add(tmpLec);
        }
        String[] tmp = new String[tmp_vector.size()];//für return
        int size = tmp_vector.size();
        if(tmpVectorNumbers.size()>0){
            Collections.sort(tmpVectorNumbers);
            if(tmp_vector.size()>0){
                Collections.sort(tmp_vector,String.CASE_INSENSITIVE_ORDER);
                size = tmpVectorNumbers.size() + tmp_vector.size();
                tmp = new String[size];
                for(int i=0;i<tmpVectorNumbers.size();i++){
                    tmp[i] = tmpVectorNumbers.get(i)+"";
                }
                for(int i=0;i<tmp_vector.size();i++){
                    tmp[i+tmpVectorNumbers.size()] = tmp_vector.get(i)+"";
                }
            }
            else{
                size = tmpVectorNumbers.size();
                tmp = new String[size];
                for(int i=0;i<tmpVectorNumbers.size();i++){
                    tmp[i] = tmpVectorNumbers.get(i)+"";
                }
            }
        }
        else{
            Collections.sort(tmp_vector,String.CASE_INSENSITIVE_ORDER);
            for(int i=0;i<size;i++){
                tmp[i] = tmp_vector.get(i).toString();
            }
        }
        return tmp;
    }
    return null;
}


...
```


----------



## faetzminator (27. Feb 2010)

Warum gibt das [c]String[][/c] und nicht [c]List<String>[/c] zurück? Und warum so viel Code  ? Ein wenigzeiliger Comparator würde da wirklich helfen...


----------



## nrg (27. Feb 2010)

noobadix hat gesagt.:


> Muss ich jetzt lernen wie man einen eigenen Comparator schreibt oder geht's einfacher?



wie faetz schon gesagt hat: Was ist bitte einfacher als das?


```
public static void main(String[] args)  {
    	List<String> list = new ArrayList<String>();
    	list.add("1");
    	list.add("10");
    	list.add("12");
    	list.add("2");
    	list.add("3");
    	list.add("4");
    	list.add("40");
    	list.add("5");
    	Comparator<String> comp = new Comparator<String>() {
			@Override
			public int compare(String s1, String s2) {
				int i1 = Integer.parseInt(s1);
				int i2 = Integer.parseInt(s2);
				if (i1 < i2) return -1;
				else if (i1 > i2) return 1;
				else return 0;
			}	
    	};
		Collections.sort(list, comp);
		for (String s : list) 
			System.out.println(s + " ");
    }
```

edit: es sollte natürlich gewährleistet sein, dass *nur* Integer in der Liste enthalten sind, sonst wirft es eine NumberFormatException.
edit2: EDIT beachten!!! ist imho besser nur einmal zu parsen und das dann in eine lokale primitive int zu stecken.


----------



## nrg (27. Feb 2010)

vllt noch zu:
"Muss ich jetzt lernen wie man einen eigenen Comparator schreibt".

gewöhn dir am besten die Einstellung ab: "ich kenn eine Lösung, die ich aber leider nicht kann, also schreib ich irgendeinen umständlichen Spagetticode"
sondern: Setz dich hin, frag google und lern wie es geht


----------



## noobadix (27. Feb 2010)

nrg hat gesagt.:


> vllt noch zu:
> "Muss ich jetzt lernen wie man einen eigenen Comparator schreibt".
> 
> gewöhn dir am besten die Einstellung ab: "ich kenn eine Lösung, die ich aber leider nicht kann, also schreib ich irgendeinen umständlichen Spagetticode"
> sondern: Setz dich hin, frag google und lern wie es geht



Die Lösung hatte ich heute sogar schon in einem anderen Thread in den Händen, allerdings nicht so schön angepasst wie hier.

Immer lernen...gibt's nicht schon so software mit der man per sprache coded? Meine Handballen tun weh. Und wenn das mit der Sprache schon stünde, könnten die Befehle abstrakter formuliert werden: "Ey alter, mach mal für i gleich 10, solange 10 kleener als ne mille,..."
Ist das ne Marktlücke und/oder ein Forumprojekt wert?

@faetziminator


> Warum gibt das String[] und nicht List<String> zurück? Und warum so viel Code  ? Ein wenigzeiliger Comparator würde da wirklich helfen...



Das hängt irgendwie damit zusammen, wie ich die Methode verbaut hat, ist leider alles etwas krischelig, ich sag mal, individuell speziell, die ArrayList brauche ich nur kurz wegen der Sortierung.


----------



## nrg (27. Feb 2010)

sowas wäre eine eierlegende Wollmilchsau. Also meiner Meinung nach nicht möglich bzw viel zu Fehleranfällig.

Sowas in der Richtung gibt es ja schon auch 1000x. Unter anderem Java. Javacode vereinfacht Bytecode. Hätten wir Java und andere Programmiersprachen nicht würden wir vllt Bytecode programmieren oder gar nurnoch Nullen und Einsen aneinerreihen .

Java bietet dafür eine strukturiere Möglichkeit Bytecode zu generieren. Du würdest dann mit Sprache Javacode generieren.

Was ich damit sagen will ist, dass alle Programmiersprachen/Hersteller eine Vereinfachung von der Programmierung anstreben. Visual Stuido (VB.NET, C#, J# etc) vereinfacht z.B. GUI Programmierung mit dem WYSIWYG-Editor: "ich ziehe diesen Butten da hin, doppeltklicke darauf und ich kann mein ButtonEvent_Klick schreiben". (edit: sogar nicht nur GUI. Ganz vergessen, dass man mit der Toolbox auch Objekte instanziieren kann, wie z.B. OleDbConnection, Timer - da wären wir gleich bei einem Nachteil -> schwer nachvollziehbar/wiederverwertbar/debugbar)

Wenn es so einfach wäre  mit "Alter mach mal dies und jenes" zu programmieren, würden wir das bereits tun und der unangenehme Nebeneffekt wäre, dass viele hier keinen Job mehr hätten. Also ist das schon gut so wie es ist .


----------



## noobadix (27. Feb 2010)

Dachte nur, weil ja mittlerweile ganze Callcentren und auch Handy-Funktionen sprachgesteuert werden. Hmm, dann vielleicht auf Nervenimpulse reagieren lassen? linken Zeigefinger 5 Sekunden heben: new String, naja, wird wohl zu offtopic, ich werd das aber nicht vergessen, weil ich hasse Tippen, ist auch so laut und man muss immer sitzen. Coden beim Dauerlaufen, das wär was.


----------



## nrg (27. Feb 2010)

noobadix hat gesagt.:


> ich werd das aber nicht vergessen, weil ich hasse Tippen, ist auch so laut und man muss immer sitzen. Coden beim Dauerlaufen, das wär was.



dich zwing keiner es zu tun. Ich hab Spass daran. Arbeite doch dann lieber als Sportlehrer/Fitnesstrainer, wenn du am Dauerlaufen mehr Spass hast 

naja wie auch immer. OT.terminate();


----------



## Landei (27. Feb 2010)

noobadix hat gesagt.:


> Immer lernen...gibt's nicht schon so software mit der man per sprache coded? Meine Handballen tun weh. Und wenn das mit der Sprache schon stünde, könnten die Befehle abstrakter formuliert werden: "Ey alter, mach mal für i gleich 10, solange 10 kleener als ne mille,..."


Dann bist du hier falsch, nimm lieber das.


----------



## eRaaaa (27. Feb 2010)

Landei hat gesagt.:


> Dann bist du hier falsch, nimm lieber das.



Oder man benutzt statt den Strings eben direkt Integer in der Liste. Dann hast du dein "Coden per Sprache"  --> Collections.sort(liste);  (/edit: ach LOL, er meint wirklich sprach gesteuert ...nun raff ichs..naja...NC  )
nix mit Comparator/Comparable oder ähnliches, das nimmt dir nämlich alles dann die Integer-Klasse ab !

Hat es einen bestimmten Grund wieso die Zahlen als Strings vorliegen?!


----------



## Gelöschtes Mitglied 5909 (27. Feb 2010)

```
Comparator<String> comp = new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return Integer.parseInt(s1).compareTo(Integer.parseInt(s2));
            }   
        }
```

sollte es auch tun


----------



## faetzminator (27. Feb 2010)

Da würde sich aber an Stelle von [c]parseInt(String)[/c] eher Integer (Java Platform SE 6) eignen.


----------



## nrg (27. Feb 2010)

was heisst "würde sich eignen". Das muss da hin .

Primitive Datentypen haben keine Methode compareTo. Sonst hätte ich nicht mit größer/kleiner Operatoren verglichen .

valueOf wäre vllt die kürzere Variante imho aber auch im Grunde nichts anderes als meine von oben.


----------

