Problem mit Hashmap

  • Antworten:13
Brausebernd
  • Forum-Beiträge: 14

07.10.2012, 11:28:22 via Website

Hallo,
ich habe ein Problem mit meiner Hashmap.
Ich habe einen String den ich aufteile und in einer Hashmap unterbringen möchte.
Der String ist so aufgebaut
1String string = "1 , A : 2 , B : 3 , C";
Diesen Teile ich in 3 Substrings

"1 , A"
"2 , B"
"3 , C"

Die Anzahl der Substrings ist nicht festgelegt. Es können also mehrere sein. Der hier gepostete String gilt nur als Test.
Diese Substrings möchte ich in eine Hashmap packen wobei die Zahl der Key sein soll und der Buchstabe der wert.

Hier mal mein kompletter Code.
1package com.example.hashmap;
2
3import java.util.HashMap;
4import android.os.Bundle;
5import android.app.Activity;
6import android.widget.TextView;
7
8public class Hashmap extends Activity
9{
10 private TextView text;
11 @Override
12 public void onCreate(Bundle savedInstanceState)
13 {
14 super.onCreate(savedInstanceState);
15 setContentView(R.layout.main);
16 text = (TextView)findViewById(R.id.text);
17
18 String string = "1 , A : 2 , B : 3 , C";
19 final String[] split = string.split(" : ");
20 final int len = split.length;
21 HashMap<String, String> map = new HashMap<String, String>();
22 for (int i = 0; i < len; i++)
23 {
24 String substring = split[];
25 String[] split1 = substring.split(" , ");
26 String zahl = split1[0];
27 String buchstabe = split1[1];
28 map.put(zahl, buchstabe);
29 text.setText("Buchstabe: " + map.get(zahl));
30 }
31
32 }
33}
Zeile 24 muss natürlich so aussehen

String substring = split[i];

hatte da aber mit dem Code einfügen Probleme

Die Ausgabe sieht jetzt so aus:
Buchstabe: C

Es soll aber diekomplette map ausgegeben werden.
Also:
Buchstabe: A
Buchstabe: B
Buchstabe: C

Wie kann ich das realisieren?

Die Hashmap soll bei einem neu empfangenen String ebenfalls aktualisiert/erweitert werden.
Wenn ich zum Beispiel einen neuen String erhalte:
1String string_neu = "1 , Z : 4 , D : ";
soll folgendes ausgegeben werden:

Buchstabe: Z
Buchstabe: B
Buchstabe: C
Buchstabe: D

Wie kann ich die Erweiterung/Aktualisierung der Hashmap realisieren?

Habe das Internet durchforstet und irgendwie nix passendes gefunden.
Es wäre nett wenn mir jemand einen Tipp oder sogar eine Lösung geben könnte.

Gruß
Brausebernd

— geändert am 07.10.2012, 11:29:18

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

07.10.2012, 12:20:00 via Website

Das es nicht funktioniert liegt an dieser Zeile:
text.setText("Buchstabe: " + map.get(zahl));

Mit dieser Formulierung überschreibst du den jeweils vorherigen Inhalt, so das am Ende nur der letzte Buchstabe tatsächlich angezeigt wird.
Wie du das lösen kannst, ist dir jetzt klar, oder?

Antworten
Brausebernd
  • Forum-Beiträge: 14

07.10.2012, 13:27:32 via Website

Hallo,
leider weiß ich nicht genau wie ich das Problem lösen kann.
Ich möchte später auch auf irgendeinen Datensatz zugreifen und ihn anzeigen lassen.

Also als Ausgabe nur "Buchstabe: B" oder ein anderer Datensatz.

Das Problem liegt meiner Meinung nach darin, dass ich den Key (Zahl) nur einmal zur Hashmap hinzufüge und dieser, in meinem konkreten Beispiel, in der for-Schleife immer wieder überschrieben wird.
Somit befindet sich am Ende der for-Schleife nur der letzte Substring in der Hashmap. (Oder lieg ich da falsch?)

Die Hashmap soll aber nach durchlaufen der Schleife wie folgt aufgebaut sein:
1 A
2 B
3 C

Dann könnte ich mir außerhalb der for-Schleife die komplette map anzeigen lassen.
Ich habe im Moment keine Idee wie ich das lösen kann.
Gruß
Brausebernd

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

07.10.2012, 13:53:40 via Website

Ja, deine Hashmap sollte den Buchstaben als Index verwenden und nicht die Zahl, weil ersteres wohl eindeutig ist, letzteres aber sicher nicht (ich vermute mal, die Zahl wird ein Zähler sein, also "b" kommt 3 mal vor? Oder ist "b" an 3. Stelle? Dann wäre die Zahl der Key und der Buchstabe der Value).

Wie du siehst wären mehr Details hilfreich, wenn du Hilfe erwartest.


Wenn du die Einträge später aus der Auflistung heraus (durch Anklicken) aufrufen willst, dann ist ein TextView dafür nicht geeignet; da wirst du ein ListView oder etwas selber gebasteltes benötigen.

Antworten
Klaus T.
  • Forum-Beiträge: 8.183

07.10.2012, 13:56:11 via Website

Brausebernd
Das Problem liegt meiner Meinung nach darin, dass ich den Key (Zahl) nur einmal zur Hashmap hinzufüge und dieser, in meinem konkreten Beispiel, in der for-Schleife immer wieder überschrieben wird.
Somit befindet sich am Ende der for-Schleife nur der letzte Substring in der Hashmap. (Oder lieg ich da falsch?)

Joo...da liegste falsch.
Wenn du Java lernen willst, solltest du mMn nicht mit einem (Android)GUI anfangen.
Mach aus deinem Code erstmal ein "normales" Java-Testprogramm und schau, ob es funktioniert....danach beschäftigst du dich mit der Integration in ein GUI.

Mach nicht den "text.setText()" rein, sondern

1System.out.println("Buchstabe: " + map.get(zahl));

dann siehst du, dass das mit der Map funktioniert.

Beschäftige dich erstmal grundsätzlich mit dem GUI bzw in diesem Fall mit dem TextView, dann weisst du, warum das nicht funktioniert :smug:

B)

— geändert am 07.10.2012, 13:58:06

if all else fails, read the instructions.

Antworten
Brausebernd
  • Forum-Beiträge: 14

07.10.2012, 15:16:15 via Website

Hallo nochmal,
hab da irgendwie nen totalen Blackout gehabt.
Funktioniert jetzt wie ich es mir vorgestellt habe!
Danke nochmal!
Gruß
Brausebernd

Antworten
Brausebernd
  • Forum-Beiträge: 14

27.10.2012, 12:21:53 via Website

Hallo,
ich bins nochmal.
Hab das Thema mal ne weile ruhen lassen und andere Sachen realisiert.
Nun fehlt mir noch zur Fertigstellung meiner App die Auswertung meiner Hashmap.
Womit ich wieder beim Thema wäre.
Ich versuch das mal zu beschreiben.
Ich habe empfange Serverdaten mittels einer TCP-Verbindung.
Diese Serverdaten werden bearbeitet, dass ich am Ende Key Value Paare habe.
Diese Paare "packe" ich in eine Hashmap.
Nun möchte ich die Hashmap nacheinander auslesen und die einzelnen Paare anzeigen lassen.
Dazu erzeuge ich dynamisch eine entsprechende Anzahl von TextViews.

Ich beschreibe das mal kurz an einem Beispiel.
Ich habe eine Hasmap mit den Wert-Paaren

1 : Das ist ein
2 : Test

Jetzt möchte ich die Hashmap auslesen und gleichzeitig die Anzahl der Einträge bestimmen.
da die Anzahl 2 ist, möchte ich mittels einer for schleife (i=0, i<Hashmapeinträge, i++) dynamisch Textviews erzeugen und an bestimmte Positionen setzen.
Die Oberfläche soll nun aus zwei Textfelden bestehen welche folgenden Text beinhalten.

TextView1: Das ist ein
TextView2: Test

Anschließend empfange ich weitere Daten vom Server welche ich wieder in Form eines Key-Value Paares bringe z.B.:
2 : Text
Nun wird der Wert in der Hashmap überschrieben.
Ich möchte jetzt aber nicht die kommplette Hashmap noch einmal auslesen und zur anzeige bringen, sondern nur das TexView2 aktualisieren.
(Quasi eine Abfrage ob Key 2 bereits vorhanden wenn ja TextView2 "Test" durch "Text" ersetzen)

Falls der Key noch nicht existiert wird er ebenfalls mit seinem entsprechenden Wert der Hashmap hinzugefügt.
Beispiel:
Daten vom Server:
3 : Fertig
Jetzt soll ein weiteres Textfeld (TextView3) erzeugt werden und zur anzeige gebracht werden.

Ausgabe:
TextView1: Das ist ein
TextView2: Text
TextView3: Fertig

Die Werte-Paare in die Hashmap zu schreiben ist kein Problem:
Die Hasmap sieht zum Schluss quasi so aus
1 : Das ist ein
2 : Text
3 : Fertig

Meine Fragen:
Wie kann ich die Hashmap nacheinander auslesen und die Anzahl bestimmen um mit einer for_Schleife die entsprechende Anzahl von Views erzeugen(Brauche nur das Auslesen, Views innerhalb einer for-Schleife dynamisch erzeugen funktioniert)?

Wie kann ich einen Vergleich anstellen ob der Key bereitsvorhanden ist und wie kann ich das entsprechende TextView aktualisieren?

Ich habe gefühlt das "komplette" Internet durchforstet und nicht wirklich was brauchbares gefunden.

Vielleicht hat ja jemand schonmal sowas ähnliches realisiert und könnte mir weiterhelfen.

Gruß
Brausebernd

Antworten
Klaus T.
  • Forum-Beiträge: 8.183

27.10.2012, 14:05:30 via App

:-D
Das typische "Tagesgeschäft" eines Programmieres, solche Probleme zu lösen!
Geniess diese kleinen Knobeleien doch, statt nach Lösungen zu fragen.... :smug:

Bei sowas Individuellem kannste i.d.R. auch googeln bist du schwarz wirst.

jm2c :)

Nochwas zur Frage....eine Hashmap liest man nicht einfach mit einer for-Schleife aus. Da gibt's natürlich Verfahren, ähnliches zu tun, aber das kriegst du raus, wenn du dich mit dem Collections-Framework beschäftigst, was 'eh sinnvoll ist, sonst kommt übermorgen die nächste Frage zu einer List, Set,.... :smug:

— geändert am 27.10.2012, 14:40:04

if all else fails, read the instructions.

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

27.10.2012, 14:41:01 via Website

Das ist doch ein typischer Fall für eine ListView mit CustomAdapter. Die Daten werden in einer Datenbank zwischengespeichert. Die Methoden hierfür werden in einem erweiterten SQLiteOpenHelper bereit gestellt. Der Loader läuft in einem eigenen Thread und regelt die Datenbeschaffung. Beim Eintreffen neuer oder geänderter Daten (auch Löschungen) wird das empfangene und aufbereitete Paket in der Datenbank eingearbeitet. Gleichzeitig wird per Broadcast die überschriebene ListActivity benachrichtigt - die dafür nicht sichtbar sein muss. Die ListActivity lädt die Daten im onResume bzw. im onReceive neu, oder aktualisiert den Adapter oder es wird über ein Flag in den Preferences der Activity mitgeteilt das sich die Daten geändert haben.

Ganz normales Tagesgeschäft das sich nicht mit einer Frage erläutern läßt.

— geändert am 27.10.2012, 14:52:46

Antworten
Klaus T.
  • Forum-Beiträge: 8.183

27.10.2012, 14:49:32 via App

Harald Wilhelm
Das ist doch ein typischer Fall für ....

Das klingt soooo spannend...ich sollte mich so langsam auch mal mit Android beschäftigen :smug: :)

— geändert am 27.10.2012, 14:49:54

if all else fails, read the instructions.

Antworten
Christian
  • Forum-Beiträge: 307

27.10.2012, 20:53:55 via Website

Hi Brausebernd,

Ich habe gefühlt das "komplette" Internet durchforstet und nicht wirklich was brauchbares gefunden.
mmhh... google -> "hashmap java" -> erster Eintrag "Java ist auch eine Insel – 11.6 Assoziative Speicher HashMap und ... ".

Dort findest du alles wichtig zu Hashmaps, das sollte dir eigentlich weiterhelfen.

Mfg Christian

Antworten
Klaus T.
  • Forum-Beiträge: 8.183

28.10.2012, 08:49:34 via App

Na, die Android-Programmierung :)
Mir fehlte bisher die Zeit, mich damit zu beschäftigen! Zu mehr als "Hello World" hat es noch nicht gereicht.

if all else fails, read the instructions.

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

28.10.2012, 09:28:14 via App

Ach so, ich dachte Du wolltest mich veräppeln.

Android ist halt ein vollständiges Betriebssystem mit einer unglaublich umfangreichen API. Meines Erachtens ist das gerade erst der Beginn. Ich schaue jeden Tag in den Android Code Review um ein Gefühl dafür zu bekommen was so alles noch kommt.

Ob Intel, Sony Ericsson. Google selbst, die Anpassungen an bionic, Linux Kernel, im Moment die ganzen SELinux Anpassungen - das ist echt der Hammer. Leider etwas zu wild und zu wenig an die Entwickler gedacht - gibt ja bald mehr Deprecated Methoden als aktuelle. Trotzdem, Android ist unter der Haube extrem heiß...

Antworten