Java nach letzter Ziffer sortieren

rosima26

Aktives Mitglied
Moin,
ich möchte gerne ein Array nach der hintersten Ziffer sortieren d.h aus 46,82,93 soll 82,93,46 werden.
Das soll dann in ner linkedList gespeichert werden. Dabei sollen die Zahlen sortiert an der jeweiligen Stelle in der Liste stehen.
Mein Code sieht bisher so aus:
Funktioniert aber nicht wirklich, vielleicht hat ja jemand eine Idee
Java:
void sort(int[] a) {
         LinkedList<Integer> bin1 = new LinkedList<Integer>();
        
         for(int i=0; i<a.length+1; i++) {
             bin1.add(0);
         }
        
         for (int i = 0; i<a.length; i++) {
             bin1.add(a[i]%10, i);
         }
         for (int i = 0; i<bin1.size(); i++) {
             if (bin1.get(i)== 0) {
                 bin1.remove(i);
                
             }
         }
         System.out.println(bin1.toString());
        }
 
Du solltest tun, was @KonradN immer vorschlägt: Überleg dir zuerst mit Stift und Papier, wie du vorgehen möchtest und danach setze es um.

Du hast also 46, 82, 93. Wenn du mit der ersten Zahl begonnen hast und die in die Liste eingefügt hast, kommt als nächstes 82 dran. Musst du die vorher oder nachher in die Liste einfügen?
 
Spielt das ne Rolle? Ich beschreibe die Liste mit 0en in solange bis die Länge des Arrays erreicht ist. Dann gehe ich durch das Array und fange vorne mit der ersten Zahl an. Dann überschreibe ich die 0 in der Liste an der %10ten Stelle mit der Zahl die beim jeweiligen Index plaziert ist. (in 9 sollte das eig. a sein.
 
Dann überschreibe ich die 0 in der Liste an der %10ten Stelle mit der Zahl die beim jeweiligen Index plaziert ist. (in 9 sollte das eig. a sein.
Wenn dein Array 3 Elemente enthält, dann gilt das ja auch für die Liste. Wie willst du denn das neunte Element der Liste überschreiben, wenn es das gar nicht gibt?

EDIT: Abgesehen davon, tut dein Programm nicht das, was du beschrieben hast. Würde es das tun, dann solltest du eine IndexOutOfBoundsException erhalten. Du schreibst den WertAusDemArray % 10 an die Stellen 0, 1 und 2.

EDIT: mea culpa. Das stimmte natürlich nicht.
 
Zuletzt bearbeitet:
Das es für Arrays und Collections sort-Methoden gibt sollte sich schon herumgesprochen haben. Alles was man tun muss, ist den gewünschten Vergleich in Form eines Comparator bereitstellen:
Java:
        final int[] a = {46, 82, 93};

        final LinkedList<Integer> list = new LinkedList<>();
        Arrays.stream(a).forEach(list::add);

        final Comparator<Integer> comparator = Comparator.comparing(t -> {
            final String s = t.toString();
            return s.substring(s.length() - 1);
        });
        Collections.sort(list, comparator);
        
        list.forEach(System.out::println);
 
Spielt das ne Rolle?
Äh, ja. Wie sortierst Du denn sonst?

Ich beschreibe die Liste mit 0en in solange bis die Länge des Arrays erreicht ist.
Du hast ein Array der Länge n und fügst einer leeren Liste n+1 Elemente hinzu.

Dann überschreibe ich die 0 in der Liste an der %10ten Stelle mit der Zahl die beim jeweiligen Index plaziert ist. (in 9 sollte das eig. a sein.
Nein, Du überschreibst nichts, sondern fügst ein.

Und der Ansatz kann nicht funktionieren. Nehmen wir mal die Sequenz 43, 42, 41, 83

43 würde bei 3 eingefügt: {0,0,0,43,0,..}, die 42 bei 2: {0,0,42,0,43,0}, die 41 bei 1 {0, 41, 0, 42, 0, 43, ...} und die 83 bei 3: {0, 41, 0, 83, 42, 0, 43, .. } Jetzt noch die 0en löschen: {41, 83, 42, 43} -> falsche Reihenfolge.
 
Naja, es handelt sich sehr wahrscheinlich um eine Übung, die nicht auf die Verwendung dieser Methoden hinaus läuft.
Wobei ich da auch durchaus ein Freund davon bin, immer auf die Verwendung von Methoden und so hin zu weisen. Klar, die vorhandenen Sortieralgorithmen sollte man nicht verwenden, aber die werden ja schon einen Sortieralgorithmus haben und der muss nur angepasst werden. Das kann man mit Copy & Paste machen und dann verändert man direkt die Kopie (= Was vermutlich dem Niveau der Schüler entspricht), aber ich würde da dennoch aufzeigen, wohin di eReise gehen würde - was das spätere Ziel wäre: Doppelten Code vermeiden, also gibt es sowas wie einen Comparator, der den Vergleich machen kann und der würde dann in der universellen Sortiermethode genutzt.

Da hätte ich dann die Hoffnung, dass die Leute so etwas sehen:
- Was Clean Code ist. (Das würde ich denen immer um die Ohren hauen. Keine Aufgabe, die die lösen, würde ich ohne eine möglichst gute Musterlösung beenden. Und eine Aufgabe wird nie eine Methodensignatur vorweisen wie in dem merge Thread die Parameter Arrays a, b, c und dann die Grenzen l1, l2, r1, r2 und so hießen)
- Wohin die Reise etwas geht mit Einhaltung gewisser Regeln wie DRY und den entsprechenden Refactorings (Wie die in der IDE gehen würde ich den guten Schülern ggf. zeigen. Da liegt die Messlatte halt höher.)

Und dann kommt der Aha Effekt, wenn man ggf. eine Klasse mit Tag und Monat geschrieben hatte und siehe da: Etwas in der Art gibt es im Framework ... oder hier die Sortierung mit einem Comparator und heya - das gibt es ja auch im Framework.

Aber es ist hoffentlich auch klar - das ist kein Widerspruch zu Deiner Aussage! Dass die Framework-Klassen da erst einmal nicht zur Lösung der Aufgabe heran gezogen werden sollten sehe ich selbstverständlich nicht anders. Und meine Ergänzung bezieht sich auch nur auf eine Musterlösung ganz am Ende - die so natürlich nicht von einem Schüler erwartet wird! Und ich mag mit meiner Sicht komplett daneben liegen - ich bin kein Lehrer und habe Wissensvermittlung nicht studiert und kenne auch die Rahmenbedingungen nicht (ggf. zu viel Stoff in zu wenig Unterrichtseinheiten, so dass dieses "weitergehende" schlicht keinen Platz hat oder sonst irgendwas in der Art). Aber wie immer kann ich es nicht lassen. meinen Senf dazu zu geben 🙂
 
Und der Ansatz kann nicht funktionieren. Nehmen wir mal die Sequenz 43, 42, 41, 83

43 würde bei 3 eingefügt: {0,0,0,43,0,..}, die 42 bei 2: {0,0,42,0,43,0}, die 41 bei 1 {0, 41, 0, 42, 0, 43, ...} und die 83 bei 3: {0, 41, 0, 83, 42, 0, 43, .. } Jetzt noch die 0en löschen: {41, 83, 42, 43} -> falsche Reihenfolge.

Ich deute das Vorhaben des TE so, er will die letzten beiden sortiert vorne haben der Rest soll bleiben.

43, 44, 42, 41, 83 will er wohl zu 41, 83, 43, 44, 42 haben , wozu das gut sein soll erschießt sich mir zwar nicht so richtig

ich möchte gerne ein Array nach der hintersten Ziffer sortieren d.h aus 46,82,93 soll 82,93,46 werden.
oder er meint es so
83, 41, 42, 43, 44
 
Zuletzt bearbeitet:
ich möchte gerne ein Array nach der hintersten Ziffer sortieren d.h aus 46,82,93 soll 82,93,46 werden.
" hintersten Ziffer" damit meint er wohl die zweite Stelle (82) da die drei ja schon sortirt sind kommt nur die erste stelle an die letze .
hat eigentlich nichts mit sortiren zu tun.

Bei nur drei Zahlen kann man es so oder so deuten.

Warten wir was der TE sagt.
 
Man halte mich für verrückt aber warum geht man nicht hin, anfangs eine leere Liste und fügt dann unter Nutzung der binären Suche (und halt dieser speziellen Art, 2 Zahlen auf <,=,> zu vergleichen) alle Zahlen aus dem Array in die Liste ein?

Je nach Größe der Liste macht es womöglich auch Sinn, die erst zu sortieren (entweder im Ursprungsarray selbst oder eine neues, sortieres Array2 zu bauen) und von da halt einfach in die Liste kopieren.
Weils bekanntlich ja nicht so wirklich eifnach ist, in einer linkedlist an einer bestimmten Position was einzufügen.

Oder immer wieder das Minimum im array suchen, in die linkedlist packen, im array löschen (bspw. durch -1 ersetzen oder sowas). rinse and repeat bis das array leer ist.
 
... oder man gönnt sich ein Array aus 10 Listen, für jede Endziffer eine, geht einmal durch sein int-Array und verteilt die einelnen Values ( listArray[value % 10].add(value) ), trommelt alle Listen zu eine einzigen zusammen, fertig. Ist zwar kurzfristig ein bischen arg Speicherhungrig, dafür dürfte es so ziemlich die schnellste Umsetzung sein. Es sei denn, man macht das ganze doch mit Arrays, statt mit Listen.

P.S.: Wenn auch negative Zahlen vorkommen dürfen -> Math.abs(value) % 10 . Klar.
 

Zurück
Oben