HashMap auf Eingabe überprüfen

  • Antworten:17
Bastian B.
  • Forum-Beiträge: 15

26.04.2013, 17:19:45 via Website

Hallo zusammen.
Bin ziemlich neu was das Programmieren von Apps angeht und hab ein kleines Problem in Bezug auf eine HashMap.
Und zwar gibt’s ein Problem im folgenden Abschnitt meiner MainActivity:

1public void buttonClick(View view){
2
3 HashMap<String, Integer> ht = new HashMap<String, Integer>();
4 ht.put("AA", 95);
5 ht.put("KK", 85);
6 ht.put("QQ", 75);
7 ht.put("JJ", 65);
8
9
10 int gegneranzahl;
11 String karteneingabe = null;
12 String Ausgabe = null;
13
14 EditText Feld1 = (EditText)findViewById(R.id.gegneranzahl);
15 EditText Feld2 = (EditText)findViewById(R.id.karteneingabe);
16 EditText FeldAusgabe = (EditText)findViewById(R.id.textAusgabe);
17
18 if (Feld1.getText().toString().length() == 0){
19 return;
20 }
21
22 if (Feld2.getText().toString().length() == 0){
23 return;
24 }
25
26 gegneranzahl = Integer.parseInt(Feld1.getText().toString());
27 // karteneingabe = Integer.parseInt(Feld2.getText().toString());
28
29 switch (gegneranzahl){
30 case 1:
31 if (ht.containsKey(karteneingabe))
32 Ausgabe = "Hier soll der Wert bzw. die Werte der HashMap stehen";
33 // Ausgabe = ht.containsKey(karteneingabe);
34 FeldAusgabe.setText(Ausgabe);
35 break;
36/* case 2:
37 if (ht.containsKey(karteneingabe))
38 Ausgabe = "läuft";
39 FeldAusgabe.setText(Ausgabe);*/
40 }
41 }
42}

Ich hab also ein Layout mit 3 EditText-Felder.
Eins zur Eingabe der Gegner als Zahl (android:inputType="numberDecimal"). Das Zweite als Eingabe eines Strings für Karten (android:inputType="text").
Und das letzte als Ausgabe des Textes (android:hint="").
Die karteneingabe soll überprüft werden, ob der eingegebene Wert in der HashMap vorhanden ist und anschließend soll der zugehörige Wert ausgegeben werden.
Beispiel: Eingabe: “AA“, Ausgabe: 95.
Allerdings funktioniert das Ganze noch nicht so richtig.
Hat jemand n Tipp?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

26.04.2013, 17:46:42 via Website

Etwas konkreter was nicht geht.

Wenn du String "aa" hast und in der Map "AA" steht ist das unterschiedlich. Wenn du nur 3-4 werte hast schreiben alle kombinationen in deine Map.
Wenn du auf den case fall nicht weiter eingehen willst. Würde folgendes gehen:

public class CaseInsensitiveMap extends HashMap<String, String> {

@Override
public String put(String key, String value) {
return super.put(key.toLowerCase(), value);
}


public String get(Object key) {
return super.get(key.toString().toLowerCase());
}
}

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Bastian B.
  • Forum-Beiträge: 15

26.04.2013, 19:30:35 via Website

Danke schonmal für deine Antwort.
Das mit dem Lower- bzw. Uppercase ist mir schon bewusst, das sollte erstmal aussen vor bleiben.
Die HashMap wird auch etwas größer und es kommen noch weitere HashMaps hinzu.
Das Problem was mir gerade wichtig ist zu lösen liegt bei der Eingabe als String.
Das heißt, wenn ich z.B. folgende HashMap erstelle:

1HashMap<Integer, Integer> ht = new HashMap<Integer, Integer>();
2ht.put(13, 95);
3ht.put(12, 85);
4ht.put(11, 75);
5ht.put(10, 65);
6.
7.
8.
9.
10.
11.
12switch (gegneranzahl){
13case 1:
14if (ht.containsKey(karteneingabe))
15Ausgabe = "Hier soll der Wert bzw. die Werte der HashMap stehen";
16// Ausgabe = ht.containsKey(karteneingabe);
17FeldAusgabe.setText(Ausgabe);

...funktioniert die Ausgabe sobald ich 13, 12, 11 oder 10 eingebe.
Bei einem String, bzw. einer HashMap mit String und Integer, wie in meinem ersten Post allerdings nicht.
Woran könnte das liegen?

Antworten
Bastian B.
  • Forum-Beiträge: 15

27.04.2013, 01:19:41 via Website

Wenn ich den String karteneingabe nicht initialisiere gibts ne Fehlermeldung.
Wie kann ich ihn dann sinnvoll initialisieren?
Sorry für die Anfängerfragen, aber bin wie gesagt noch ziemlich neu darin.

Antworten
impjor
  • Forum-Beiträge: 1.793

27.04.2013, 09:46:50 via App

Du musst den String irgendwann mal einen Wert zuweisen, wie du es mit gegnerzahl gemacht hast. Die entsprechende Zeile hast du aber auskommentiert. Warum du in dieser versucht hast, den Text des EditText in einen int(eger) umzuwandeln weiß ich nicht. Lass einfach mal das Integer.parse.... weg.
Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Bastian B.

Antworten
Bastian B.
  • Forum-Beiträge: 15

27.04.2013, 13:27:50 via Website

Danke für den Tipp, hat geklappt.
Ein kleines Problem hab ich allerdings immer noch.
Ich möchte nämlich als Ausgabe nicht irgendeinen Text, sondern den Wert des Strings in der HashMap.
Hab das in Java mal getestet und es funktionierte auch, nur wenn ich hier z.B.:

1Ausgabe = ht.get(karteneingabe);

eingebe, hab ich ein Missmatch, da ich nicht von Integer zu String konvertieren kann.
Ändere ich die "String Ausgabe = ""; in "Integer Ausgabe" erhalte ich eine Fehlermeldung sobald ich die Ausgabe starte.

Am liebsten hätte ich eine Ausgabe mit String und dem Wert, so wie man das unter Java kennt.
z.B.:
System.out.println("Gewinnchance: " + ht.get(karteneingabe + " Prozent.");

Jemand ne Idee?

Antworten
Bastian B.
  • Forum-Beiträge: 15

28.04.2013, 13:16:57 via Website

Super, hat geklappt.
Letzte Frage:
Ich hab ja eine HashMap benutzt um einem String einen Wert(Int) zuzuweisen.
Eigentlich möchte ich dem String allerdings 2 Werte zuweisen, was ja leider mit einer HashMap nicht funktioniert.
Kann mir jemand helfen wie ich das umsetzen kann und ggf. n Beispiel dafür bringen?
Also mein String "AA" soll beispielsweise die Werte 95 und 0.5 haben.
Diese sollten auch wie in meinem letzten Post beschrieben so ausgegeben werden können.

Antworten
Bastian B.
  • Forum-Beiträge: 15

28.04.2013, 21:27:54 via Website

Ok, hab das mal versucht.
Funktioniert auch alles, bis auf die Ausgabe.

1public class MeineTolleKlasse
2{
3 double zahl1;
4 double zahl2;
5
6 public MeineTolleKlasse(double zahl1, double zahl2)
7 {
8
9 this.zahl1 = zahl1;
10 this.zahl2 = zahl2;
11 }
12
13 public double getZahl1(){
14 return this.zahl1;
15 }
16
17 public double getZahl2(){
18 return this.zahl2;
19 }
20
21}

1import java.util.HashMap;
2
3public class HashKlasse
4{
5 HashMap<String, MeineTolleKlasse> myMap = new HashMap<String, MeineTolleKlasse>();
6
7 public void hash(String eingabe)
8 {
9
10 MeineTolleKlasse mtk1 = new MeineTolleKlasse(95, 0.5);
11 MeineTolleKlasse mtk2 = new MeineTolleKlasse(85, 0.5);
12 MeineTolleKlasse mtk3 = new MeineTolleKlasse(75, 0.5);
13
14 myMap.put("AA", mtk1);
15 myMap.put("KK", mtk2);
16 myMap.put("QQ", mtk3);
17
18 if(myMap.containsKey(eingabe)){
19 System.out.println(myMap.get(eingabe));
20 }
21 else{
22 System.out.println("Falsche Eingabe");
23 }
24 }
25 }

Gebe ich jetzt z.B. "AA" ein erhalte ich als Ausgabe nicht etwa meine 2 Werte (95 und 0,5) sondern etwas in Richtung "MeineTolleKlasse@5ec60ee2". Woran liegt das?

Antworten
impjor
  • Forum-Beiträge: 1.793

28.04.2013, 22:03:39 via App

Nun ja, du wandelst ein Object in einen String (=text) um, was soll denn da rauskommen?
Mach irgendwas mit getZahl1().toString()

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

29.04.2013, 08:19:31 via Website

impjor
Nun ja, du wandelst ein Object in einen String (=text) um, was soll denn da rauskommen?
Mach irgendwas mit getZahl1().toString()

.toString() auf dem Objekt selbst reicht schon, getZahl1() ist ja ein primitiver Typ.
Also implementier eine toString() Methode für deine Datenklasse.

@Frank:
Ansonsten würde ich echt mal bei den Java-Grundlagen anfangen, denn die hier gestellten Fragen werden in jedem Java-Einsteiger-Buch schon behandelt.

Antworten
impjor
  • Forum-Beiträge: 1.793

29.04.2013, 14:32:55 via App

@Rafael K:
Seit wann ist ein Object eine primitiver Typ? Du siehst ja an seiner Ausgabe, dass es nicht so ist.
Aber in Sachen Java- Grundlagen kann ich dir nur zustimmen

Gruß

— geändert am 29.04.2013, 14:33:20

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
impjor
  • Forum-Beiträge: 1.793

29.04.2013, 15:33:34 via App

Rafael K.
.toString() auf dem Objekt selbst reicht schon
mtk1.toString() reicht nicht, deshalb "" + mtk1.getZahl1(); oder
Double.toString(mtk1.getZahl());

Aber vielleicht berichtet der TE einfach, ob irgendetwas geklappt hat.

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

29.04.2013, 15:47:37 via Website

impjor
Rafael K.

.toString() auf dem Objekt selbst reicht schon
mtk1.toString() reicht nicht,
Wenn dann zitier die Zeile darunter doch bitte auch mit :)
Also implementier eine toString() Methode für deine Datenklasse.

Eclipse bietet doch sogar einen Generator für toString() Methoden, also warum soll man alle Getter einzeln aufrufen?

Alt + Shift + S --> S --> Member auswählen --> bestätigen --> fertig ist die toString() Methode

— geändert am 29.04.2013, 15:49:54

Antworten
impjor
  • Forum-Beiträge: 1.793

29.04.2013, 15:57:45 via App

Das mit dem Generator ist natürlich klasse, wusste ich noch gar nicht :)
Ich wollte dem TE einfach erklären, dass er eine Klasse, die die toString Methode nicht erbt, nicht einfach in einen String umwandeln kann. Wahrscheinlich braucht er irgendwann die Werte einnzeln und dann steht er mit der selbstgemachten toString Methode auf dem Schlauch. Wenn man beide zusammen haben will, gehen beide Methoden, oder? :-p

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten