Java, switch mit nem String??

Diskutiere Java, switch mit nem String?? im Developer Network Forum im Bereich Hardware & Software Forum; Hi, ich als Java Noob hab da mal ne Frage (und wird nicht die einzige sein, in den nächsten wochen) :) Aufgabenstellung lautet wie folgt...
  • Java, switch mit nem String?? Beitrag #1
Penecho

Penecho

Bekanntes Mitglied
Dabei seit
19.09.2001
Beiträge
2.636
Reaktionspunkte
1
Ort
RLP
Hi, ich als Java Noob hab da mal ne Frage (und wird nicht die einzige sein, in den nächsten wochen) :)

Aufgabenstellung lautet wie folgt:

Implementieren Sie eine Methode, welche als Parameter eine Ziffer als Wort übergeben bekommt (z.B.: ”eins“) und diese dann als Zahl als Rückgabewert (int) der Methode zurückgibt. Wird ein ungültiges Wort übergeben, so soll −1 zurückgegeben werden.

Mein Versuch:

public class Switch2 {


public static void main(String[] args) {


String zahl = "eins";

switch (zahl) {

case eins:
System.out.println("1");
break;
case zwei:
System.out.println("2");
break;
case drei:
System.out.println("3");
break;
case vier:
System.out.println("4");
break;
case fuenf:
System.out.println("5");
break;
case sechs:
System.out.println("6");
break;
case sieben:
System.out.println("7");
break;
case acht:
System.out.println("8");
break;
case neun:
System.out.println("9");
break;
default:
System.out.println("-1");

}

}

}


Problem: Switch funzt nicht mit nem string :(

Wie ändere ich das??


Cu



Penecho
 
  • Java, switch mit nem String?? Beitrag #2
C

COGE

Bekanntes Mitglied
Dabei seit
13.01.1999
Beiträge
6.151
Reaktionspunkte
3
Ort
hinten wie von vorne
case "eins" oder 'eins' geht nicht ?

dann wird dir ausser if (zahl == "eins")
then
else
...

nciht viel übrig bleiben
 
  • Java, switch mit nem String?? Beitrag #3
Siege

Siege

Bekanntes Mitglied
Dabei seit
04.03.1999
Beiträge
707
Reaktionspunkte
0
Ort
HAJ
Ist richtig - switch funktioniert in Java nur mit Zahlen (merke: char ist Java-intern auch eine Zahl)... da Switch-Anweisungen prinzipiell nur bei Zahlenbehandlungen effizient sind. Alle anderen Datentypen, Objekte etc. behandelt man in Java gesondert.

In Deinem Fall würde man (ich) es der Einfachheit halber z.B. so machen:

Code:
String meineZahl = "zwei";

java.util.HashMap zuordnung = new java.util.HashMap();
zuordnung.put("eins", "1");
zuordnung.put("zwei", "2");
zuordnung.put("drei", "3");
... und die weiteren
            
if (zuordnung.containsKey(meineZahl)) {
  System.out.println(zuordnung.get(meineZahl).toString());
} else {
  System.out.println("-1");
}
Du kannst es aber z.B. auch mit einem Zuordnungs-Array machen, je nachdem was Du vorhast. Bei Java führen viele Wege nach Rom, switch allerdings eher selten...

Code:
String meineZahl = "zwei";        
String[] zahlen = { "eins", "zwei", "drei" };
String ergebnis = "-1";
for (int i=0; i<zahlen.length; i++) {
  if (zahlen[i].equals(meineZahl)) ergebnis = Integer.toString(i+1);
}
System.out.println(ergebnis);
 
  • Java, switch mit nem String?? Beitrag #4
Siege

Siege

Bekanntes Mitglied
Dabei seit
04.03.1999
Beiträge
707
Reaktionspunkte
0
Ort
HAJ
Achso - hab nich gesehen, dass das ja eh "int" zurückgeben soll, dann kannst Du Dir die Typumwandlung sparen... wäre dann in Fall 2:

Code:
int ergebnis = -1;
for (int i=0; i<zahlen.length; i++) {
  if (zahlen[i].equals(meineZahl)) ergebnis = i+1;
}
 
  • Java, switch mit nem String?? Beitrag #5
Siege

Siege

Bekanntes Mitglied
Dabei seit
04.03.1999
Beiträge
707
Reaktionspunkte
0
Ort
HAJ
Moin, auch wenn Penecho es nicht mehr zu brauchen scheint (?)...

Falls jemand diesen Thread mal finden sollte, noch eine kleine Anmerkung zu Stringvergleichen unter Java: Der switch funktioniert aus einem bestimmten Grund nicht mit Strings, auf den auch COGE bereits reingefallen ist. Ich erklär' das mal fix:

Ein String ist unter Java kein einfacher Datentyp, sondern ein Objekttyp. Das bedeutet, dass sich auch die einfachen Vergleichsfunktionen ( z.B. "==" ) nicht so auf ihn anwenden lassen, wie man zunächst vermuten würde.

Bei den einfachen Verleichstypen wird in Verbindung mit Objekten (u.A. String) nicht der Inhalt des Objektes verglichen, sondern das Objekt selber. Das bedeutet, dass ein Verleich wie
Code:
if (zahl == "eins")
oder auch
Code:
if ("eins" == "eins")
immer false zurückgeben würde.

Zur Erklärung: die Anweisung "eins" erzeugt ein neues Objekt vom Typ String mit dem Inhalt "eins". Dies geschieht sowohl auf der linken als auch auf der rechten Seite der Vergleichsfunktion. Nun ist das linke "eins" zwar ein Objekt mit dem Inhalt "eins", das rechte ebenfalls - aber beide Objekte sind eben nicht "das selbe" Objekt, also liefert == in diesem Fall immer false zurück.

Zum Vergleichen von Strings bringt die Klasse String deshalb eigene Funktionen mit: equals() und equalsIgnoreCase().

Das bedeutet:

Code:
// Stringvergleich mit Methoden der Klasse String
"eins".equals("eins") --> true;
"Eins".equals("eins") --> false;
"Eins".equalsIgnoreCase("eins") --> true;

// Objektvergleich Objekt1 mit Objekt2
"eins" == "eins" --> false;

// aber: Objekt1 mit sich selbst
String eins = "eins";
eins == eins --> true; (!)

Letztendlich der Schluss:
"switch...case" vergleicht immer mit Hilfe der einfachen Vergleichsfunktionen. Da diese aber nur mit einfachen Datentypen (int, double, char, etc.) funktionieren, sind alle Objekttypen nicht mit der Funktion kompatibel - logisch, oder?

Wer das verstanden hat, hat schon mal einen wichtigen Schritt in Richtung Java getan... viel Glück ;)
 
  • Java, switch mit nem String?? Beitrag #6
FerFemNemBem

FerFemNemBem

Moderator
Teammitglied
Dabei seit
11.09.1999
Beiträge
4.494
Reaktionspunkte
0
Halloechen,

das ganze ist eine sehr boese Falle, da man beim Vergleich von (scheinbar) zwei Objekten (in diesem Fall Strings) mittels "==" nicht zwangslaeufig ein "false" zurueckbekommt. Da geht beim Testen alles gut und irgendwann sucht man sich mal dumm und dusselig, wo der Fehler liegt. Hier mal ein Beispiel:
Code:
String test1 = "test";
String test2 = "test";

if(test1 == test2)
{
    System.out.println("gleich");
}
else
{
    System.out.println("ungleich");
}
Hier bekommt man, obwohl es sich ja bei test1 und test2 um 2 unterschiedliche Objekte handeln sollte, ein "gleich" zurueck. Das kommt durch die Compileroptimierung. Hier wird nur 1 Objekt mit dem Inhalt "test" angelegt, auf den dann test1 und test2 zeigen.
Das der Compiler doch nicht soo schlau ist wie man nun denkt, merkt man, wenn man den zweiten String so erzeugt:
Code:
test2 = "te";
test2 = test2 + "st";
Das ist zwar auf den ersten Blick das gleiche, aber da funktioniert es auf einmal nicht mehr. ;)

Ist schon eine verrueckte Sache, dieses java...

Gruss, FFNB.
 
  • Java, switch mit nem String?? Beitrag #7
Siege

Siege

Bekanntes Mitglied
Dabei seit
04.03.1999
Beiträge
707
Reaktionspunkte
0
Ort
HAJ
Ups - Du hast Recht... mhh - naja, da ich es irgendwie schon als Gesetz verinnerlicht hatte, Objekte nie so zu vergleichen, habe ich da wohl nicht genau hingeschaut.


So lässt es sich wohl ganz gut beschreiben:
Code:
String test1 = new String("test");
String test2 = new String("test");
System.out.println(test1 == test2);
// ergibt false, da es sich um zwei verschiedene Objekte handelt...
System.out.println("test" == "test");
// ergibt true, da es sich um zwei Zeiger auf ein und dasselbe Objekt handelt
 
  • Java, switch mit nem String?? Beitrag #8
guzi

guzi

Bekanntes Mitglied
Dabei seit
11.02.2002
Beiträge
1.505
Reaktionspunkte
2
Ort
nirvana
strings würde ich auch nicht mit "==" verlgeichen sondern mit der methode compareTo
 
Thema:

Java, switch mit nem String??

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben