Stringsort

luckyluke9

Mitglied
Hi, ich soll ein Programm erstellen, dass drei Eingabe miteinander lexikalisch vergleicht und diese geordnet ausgibt. Sowas muss doch auch mit Schleifen möglich sein...
[CODE lang="java" title="Stringsort"]package uebung07;
import javax.swing.JOptionPane;
public class Stringsort {
public static void main(String[] args) {
String a = JOptionPane.showInputDialog("Text1:");
String b = JOptionPane.showInputDialog("Text2:");
String c = JOptionPane.showInputDialog("Text3:");
String alphabet = "abc";
int i = 0;

while (i <= 2) {
String.valueOf(alphabet.charAt(i)).compareTo(a);
String.valueOf(alphabet.charAt(i)).compareTo(b);
String.valueOf(alphabet.charAt(i)).compareTo(c);

System.out.print(String.valueOf(alphabet.charAt(i)).compareTo(a) + "\t");
System.out.print(String.valueOf(alphabet.charAt(i)).compareTo(b) + "\t");
System.out.println(String.valueOf(alphabet.charAt(i)).compareTo(c));
i++;
}
}
}[/CODE]
Danke im Voraus
 

luckyluke9

Mitglied
Ich versuche die Eingabe irgendwie an die Inkrementierung zu koppeln, aber was im Moment passiert ist, dass nicht der String a genommen, sondern ein neuer String mit dem Wert a erzeugt wird.
 
K

kneitzel

Gast
Bei allen diesen Problemen ist der erste Schritt, sich den Algorithmus zu überlegen. Wie würdest Du denn vorgehen? Also einfach mit Stift und Zettel.

Erst, wenn man das hat, dann kann man das nach und nach in Code übersetzen. Und dann kann man bei jedem einzelnen Schritt einfach helfen bezüglich Syntax und so.

Beispiel: Dein Code: String.valueOf(alphabet.charAt(i)).compareTo(a); ist so relativ sinnlos. Du vergleichst etwas, aber das Ergebnis interessiert Dich nicht. Damit macht die Zeile eigentlich nichts außer ggf. die CPU paar Takte zu beschäftigen ohne danach irgend etwas verändert zu haben.

Das ist an der Stelle aber erst einmal egal - Du solltest uns - wie schon am Anfang gesagt - erst einmal erläutern, was Dein Algorithmus genau machen soll. Die Umsetzung in Java ist dann etwas, bei dem wir Dir dann sehr gut helfen können und so Dinge wie im letzten Abschnitt erläutern können. (Daher auch das Abstempeln des Codes als "sinnlos" nicht zu Herzen nehmen! Am Anfang sind so Problem vollkommen normal und da helfen wir gerne. Und das wirst Du auch sehr schnell verstehen. Die Komplexität ist jetzt halt nur erhöht, weil Du einen Algorithmus in einer Sprache formulieren willst, die Du noch nicht beherrscht.)
 

luckyluke9

Mitglied
Ok, also das Ziel ist es, wie zu Beginn erklärt, ein Programm zu schreiben, welches drei Eingaben, die mit JOptionPane.showInputDialog getätigt werden, vergleicht. Ich habe mir überlegt, dass es einfach ist eine Schleife zu schreiben, in der dreimal die Methode compareTo() benutzt wird
Java:
String.valueOf(alphabet.charAt(i)).compareTo(a);
String.valueOf(alphabet.charAt(i)).compareTo(b);
String.valueOf(alphabet.charAt(i)).compareTo(c);
Die Idee ist, dass sich bei jedem Durchgang der zu vergleichende String ändert. Also erst a.compareTo(a), a.compareTo(b) und a.compareTo(c), dann b.compareTo(a), b.compareTo(b), usw. Das wollte ich damit erreichen, dass ich mit der Methode String.valueOf() und charAt() das Zeichen in einem String wiedergeben lasse, welches gleich dem Bezeichner des zu vergleichenden Strings ist. Funktioniert aber nicht, da so einfach nur ein String erzeugt wird, der den Wert a, b oder c hat. Ich habe dabei an die Inkrementierung gedacht, welche ja eine Zahl nach jedem Durchlauf einer Schleife erhöht.
Ich hoffe es ist alles verständlich.
 

temi

Top Contributor
welches drei Eingaben, die mit JOptionPane.showInputDialog getätigt werden, vergleicht.
Du hast also drei String, die du vergleichen möchtest. Wo die herkommen ist irrelevant.

Der Rest ist mir leider nicht verständlich. Was soll das "alphabet"?

Sollst du das so machen? Oder sollen die drei Strings einfach in ihrer lexikalischen Reihenfolge ausgegeben werden?

Dann schreibe einfach ein paar if-Bedingungen, die das entsprechend erledigen. Falls es mehr Strings werden, dann sollten die in eine Collection, die man anschließend sortieren kann.
 

Oneixee5

Top Contributor
Nur mal so nebenbei: dein Ansatz führt nicht zum richtigen Ergebnis. Strings sortiert man mit einem Collator. Collator berücksichtigt die Besonderheiten einer Sprache, wie z.B.: Umlaute.
@see https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/text/Collator.html
String#compareTo(String anotherString) vergleicht nur ob an einen bestimmten Index unterschiedliche characters vorhanden sind und bildet die entsprechende Differenz ihrer Unicode-Werte an der ersten Funstelle ab.
 

luckyluke9

Mitglied
Die Aufgabe ist wörtlich:
Erstellen Sie ein Programm mit dem Namen Stringsort. Das Programm soll mithilfe von JOptionPane.showInputDialog drei Eingaben einlesen und in drei Stringvariablen speichern. Anschließend sollen die drei Strings lexikalisch sortiert ausgegeben werden.
 

temi

Top Contributor
Die Aufgabe ist wörtlich:
Erstellen Sie ein Programm mit dem Namen Stringsort. Das Programm soll mithilfe von JOptionPane.showInputDialog drei Eingaben einlesen und in drei Stringvariablen speichern. Anschließend sollen die drei Strings lexikalisch sortiert ausgegeben werden.
Dann gehe ich davon aus, dass die Aufgabe mit "schreib ein paar if-Bedingungen und gib die Werte entsprechend aus" korrekt erfüllt ist. @Oneixee5 hat zwar Recht, aber ich habe meine Zweifel, dass das von dir verlangt wird.
 
K

kneitzel

Gast
Sorry, dass ich jetzt erst wieder schreiben konnte:
Du hast jetzt (in #7) beschrieben, was Du in Deinem Code machen wolltest. Das war aber nicht wirklich dass, was ich Dich gefragt habe.

Wenn Du drei Wörter bekommen hast und Du diese sortiert ausgeben sollst: wie gehst Du dann vor?

Also ich gebe Dir drei Worte:
Hallo
Welt
Du

Kannst Du diese sortiert ausgeben? Wie gehst Du dabei vor?

Generell gibt es dazu viele Ansätze und irgend einen musst Du für Dich finden. Und dann kann man den umsetzen.

Also was man z.B. machen kann (Ansatz Sortierung, ist relativ Universell, also auch auf 4, 5, 6, ... Elemente erweiterbar):
- Ich vergleiche das erste mit dem zweiten Wort: Kommt das erste Wort nach dem Zweiten, dann Tausche ich die Wörter (erstes und zweites).
- Dann vergleiche ich das zweite Wort mit dem Dritten Wort. Ist das zweite Wort größer, dann
a) tausche ich das zweite und dritte Wort und
b) mache ich noch etwas, das Du Dir überlegen musst, wenn Du diesen Ansatz verfolgen willst.
- Dann gebe ich die drei Worte aus: erst das erste, dann das zweite und am Ende das dritte.

Ein anderer Ansatz wäre: Vergleichen und darüber festlegen:
- Ich suche mit Vergleichen von allen drei Wörtern das, das als erstes kommt.
- Ich suche mit Vergleichen von allen drei Wörtern das, was als zweites kommt.
- ich suche mit Vergleichen von allen drei Wörtern das, was als drittes kommt.
(Reihenfolge der Schritte ist egal, ggf. ist das erste und dritte am einfachsten, das zweite wäre dann das, was übrig bleibt.)
Das würde also auch gehen - ist aber deutlich schwerer zu erweitern als der erste Ansatz.)

Wenn man sich den Algorithmus überlegt hat, dann kann man zur Umsetzung kommen. Und auf Elemente zugreifen über eine "Nummer", da bietet sich dann ggf. ein Array an. Aber das kann man sich dann in Ruhe überlegen - da gibt es keine festen Vorgaben.
 

Neue Themen


Oben