Erste Schritte HashMap Kurze Frage - Werte über Schleife ausgeben

SewIsch

Mitglied
Hi,

ich hab hier eine Schleife die nicht gehen will:

Java:
for(int i; i <= HashMap.size(); i++)
{
CODE FÜR AUSGABE
}

In der HashMap sich Werte und die size wird auch angezeigt. Aber warum immer eine Fehlermeldung kommt ist mir unklar.


mfg
 
Ein Lehrbuch hab ich leider noch nicht.

Danke :-\
Man bin ich dumm, ich hatte erst i = 0. Dann kam eine andere Fehlermeldung und ich hab alles wieder umgeschrieben und dabei i = 0 entfernt.
Jetzt weiß ich auch was die Fehlermeldung sollte, und ich dachte BlueJ wäre dumm.

Edit: Genau jetzt bin ich wieder bei der Fehlermeldung "inkompatible Typen"
Also ist ist vom Typ int und size() laut Dokumentation mehr oder weniger auch.

mfg
 
Wenn du was an deinem Code geändert hast (im Bezug auf deinen ersten Post) und du jetzt andere Fehlermeldungen kassierst, dann poste nochmal deinen aktuellen Code und sag in welcher Zeile der Fehler auftritt.
 
Java:
HashMap <String, String> HashMapA = new HashMap<String, String>();


public Klasse()
     HashMapA.put("Friedrich", "45678");
     HashMapA.put("Albert", "56789");
  }
  
  public void printAllKunden()
  {
    
     for (int i = 0; i = HashMapA.size(); i++)
        {
            System.out.print("....");
        }
    }


HashMapA.size() wird bei der Fehlermeldung rot markiert
 
bei der for schleife gibst du als zweites die Bedingung ab wielang die for schleife laufen soll. da muss also ein boolean stehen, du hast da aber ne zuweisung stehen.
 
Also das passt schon. size() ist ja dynamisch, das heißt eine Liste mit nicht fester Listenlänge, kann also länger werden.

Du darfst das nicht so streng sehen. also so ungefair. Das ist das Problem. Und dumm ist hier schon mal keiner.
 
über eine Hashmap würde ich nicht mit einem zähler iterieren sondern
Java:
		HashMap<String, String> hashMapA = new HashMap<String, String>();

		hashMapA.put("Friedrich", "45678");
		hashMapA.put("Albert", "56789");
		
		for (Entry<String, String> entry : hashMapA.entrySet()) {
			System.out.println(entry.getKey());
			System.out.println(entry.getValue());
		}

und Variablennamen schreibt man klein (hashMapA) .... am besten gleich angewöhnen
 
Zuletzt bearbeitet von einem Moderator:
OK, der Code ging plötzlich:

Java:
for(...;i < HashMapA.size();...){...


Aber der Unterschied zwischen < und <= ist mir aber nicht klar bzw. warum ich nicht = verwenden kann. Das Erste i ist doch quasi der Start und das andere i das Ende?
 
also Du solltest dich auf jeden Fall mal mit den Java Grundlagen beschäftigen ... Buchempfehlungen gibt es hier im Forum genug.

1. in java ist das = kein Vergleich sondern eine Zuweisung, Vergleiche gehen mit ==

Java:
for (int zaehler = 0; zaehler < hashMapa.size(); zaehler++) {
			
		}

int zaehler=0 --> initialisiert den zaehler

zaehler < hashMapA.size() --> heißt laufe solange der zaehler echt kleiner hashMapA.size() ist

zaehler ++ --> erhöht den zähler in jedem Schleifendurchlauf um 1

[EDIT] und mit einem Zähler über eine Map zu iterieren macht nicht viel Sinn siehe meinen vorigen Post ... mit nem Zähler eher über ein Array etc
vergiss den Hinweiß mit dem Buch ... hatte das hier:
Ein Lehrbuch hab ich leider noch nicht.
nicht gelesen .... sorry
[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
Java:
      private JLabel [] jl = new JLabel[7];
               for(int i=0;i<jl.length;i++){
			jl[i]= new JLabel("TestLabel"+i);
			...
		}
Zum erläutern:
In der for-Schleife steht i<jl.length wobei ich auch i<7 schreiben könnte,
dabei muss man bedenken, dass das Array zwar 7 Feldelemte hat, aber die Indexe 0,1,2,3,4,5,6 sind.
Deshalb geht die for-Schleife auch nur bis i<7 also 6.
Würde man i<=7 würde dein Array dir ein OutOfBounds exception ausgeben. Weil jl[7] nicht exsistiert.
Ähnlich wird es sich bei deiner HashMap auch verhalten.

Schnell zusammen gefasst
i<7 -> i kleiner 7
i<= -> i kleiner oder gleich 7
 
Das lief ja super...

Wenn in der HashMap n Element sind und die Zählervariable bei 0 anfängt und Schleife vor dem ersten Schleifendurchlauf die Variable nicht inkrementiert, dann muss es danach (nur) noch n-1 Durchläufe geben. Beim n-1. Durchlauf wird dann i noch einmal inkrementiert, wonach < nicht mehr gilt und die Schleife dann verlassen wird.
 
Zuletzt bearbeitet von einem Moderator:
Ein Beispiel: Sei n=3.

1. i=0. -> Schleife wird durchlaufen.
2. i=1. -> Schleife wird durchlaufen.
3. i=2. -> Schleife wird durchlaufen.
4. i=3. -> Schleife wird nicht durchlaufen.
 
Java:
for (int i = 0; i < 15; i++) {
  System.out.println(i + 1 + ". durchlauf, i=" + i + ".");
}
 
Zuletzt bearbeitet von einem Moderator:
Es gibt auch einen EDIT Button :rtfm:

So schaut der aus:
edit.gif
 
Ja, Entschuldigung, dann fass die ganzen Beiträge zusammen. @Mods: Wenn es geht, bitte die drei Beiträge mit den Beispielen in einem Beitrag zusammenfassen oder die Beispiele wieder verschieben.
 
Zuletzt bearbeitet von einem Moderator:
Ich wollt dich nur drauf aufmerksam machen, dass ein Dreifachpost nicht unbedingt sein muss. Wenn du noch was zu deinem Posting hinzufügen willst dann editiere deinen letzten Post, dafür ist der "Ändern" Button nun mal da.
 
OK Danke für die Hilfe 🙂

Jetzt häng ich aber am nächsten Schritt fest
Aufgabe: "Außerdem soll die Klasse eine Methode printAllPersonen enthalten, in der über eine der beiden Maps iteriert wird und jeweils mit Hilfe von System.out.println(…) die String-Repräsentation einer Person ausgegeben wird."


Java:
hashMapA.put("Friedrich", "45678");
hashMapA.put("Albert", "56789");

Ich hätte jetzt ja einfach:
System.out.println(hashMapA) gemacht und die ganze Map wird ausgegeben :-\


Mit System.out.println(mapSucheUeberNummer.get("Friedrich")); wird nur "45678" ausgegeben.
Jetzt soll ich den Key + den Wert in eine Zeichenkette packen und diese dann für jeden Eintrag ausgeben.

Im Grunde was so was ähnliches Andgalf schon geschrieben hat:
Java:
System.out.println(......getKey());
System.out.println(.....getValue());

Bei einer ArrayList ist der Schlüssel ja die Nummer des Feldes, aber bei meiner HashMap ist es der Name.
Jetzt muss ich irgendwie sagen: gebe den Schlüssel und den Wert vom ersten Wertepaar aus.
Da der Schlüssel aber der Name und keine Zahl ist, ist dies doch gar nicht möglich?
ich hab schon die Dokumentation durchgeschaut aber keinen passenden Befehl gefunden oder hab ich die Aufgabe falsch verstanden?

Java:
 public void printAllPersonen()
{
for (int i = 0; i < hashMapA.size(); i++)
        {

                 
        }
}
 
Ok das Problem von oben konnte ich lösen. Die Ausgabe klappt jetzt.

Aber ich hab an anderer Stelle eine Fehlermeldung die ich nicht verstehe:
Java:
HashMap <Integer, String> mapSucheUeberNummer = new HashMap<Integer, String>();
mapSucheUeberNummer.put(12345, "Horst");
     mapSucheUeberNummer.put(23456, "Adolf");
     mapSucheUeberNummer.put(34567, "Wilhelm");
     mapSucheUeberNummer.put(45678, "Terence");
     mapSucheUeberNummer.put(56789, "Albert");



public String getStudentByRegistrationNumber(int nummer)
{
 Set setOfKeys = mapSucheUeberNummer.keySet();
    Iterator iterator = setOfKeys.iterator();
      
      while(iterator.hasNext())
      {
          int integerNummer = (int) iterator.next();
        
         if (integerNummer = nummer) >>>>Hier sind die Datentypen nicht kompatibel
            {
            String stringName = (String)mapSucheUeberNummer.get(integerNummer);
           }
          System.out.println(toString(integerNummer, stringName));
        }
        return "www";
 
Spricht irgendetwas dagegen, alles typsicher mit Generics zu machen?

Wenn ich das richtig verstanden habe:
Java:
		Map<Integer, String> meineMap = new HashMap<>();
		Set<Integer> keySet = meineMap.keySet();
		Collection<String> values = meineMap.values();
 
Ach mit = weist man in Java immer meinen Wert zu und == ist immer ein Vergleich, gut das merkt ich mir ab jetzt 🙂

"Spricht irgendetwas dagegen, alles typsicher mit Generics zu machen?"
Was heißt das genau? xD
 
"Spricht irgendetwas dagegen, alles typsicher mit Generics zu machen?"
Was heißt das genau? xD
na, solche Zeilen wie
int integerNummer = (Integer) iterator.next();
kann man wohl doch nicht wirklich schön finden, oder?

Woher nimmst Du denn die Gewissheit, das da IMMER ein Integer über den Iterator zurückkommt. da wird wohl auch Deine IDE, z.B. Eclipse, gewarnt haben, dass man das sich noch mal anschauen sollte, oder?
Wenn ich das richtig erkenne, sollte da besser stehen:
Java:
		Map<Integer, String> mapSucheUeberNummer = new HashMap<>();
		 Set<Integer> setOfKeys = mapSucheUeberNummer.keySet();
		    Iterator<Integer> iterator = setOfKeys.iterator();
Und genau dafür wurden Generics in Java eingeführt.
 
Ah Ok 🙂
Ich muss leider "BlueJ" verwenden, da wird nix angezeigt.

"Ergänzen Sie Ihre Klasse um die Methoden getStudentByRegistrationNumber(int nr) sowie getStudentByName(String n), die in der passenden Map nach dem gewünschten Studenten suchen und das entsprechende Student-Objekt zurückgeben. Falls der gesuchte Student in der betreffenden Map nicht vorhanden ist, wird eine Fehlermeldung auf der Konsole ausgegeben und null zurückgeliefert."


Soweit klappt ja alles.
Ich hatte jetzt vor:

Wenn Name gefunden:
return "den Namen u.s.w."
ansonsten:
return "null" (Warum gerade Null bei einem String)?

Jetzt ist es aber eine Schleife welche die Werte sucht
Und deswegen wird ja (wenn ich nicht gerade den letzten in der Liste erwische immer null zurückgegeben.

Meine Ideen wären jetzt:
Entweder die Schleife beim Fund verlassen oder eine weitere Variable einbauen, die beim Fund auf einen Wert gesetzt wird und verhindert dass die Befehle in else dann ausgeführt werden Fund ausgeführt werden.
Ich würde das Verlassen der Schleife vorziehen, dann müsste ich den Iterator beim Fund irgendwie auf einen Wert setzen damit er die Schleife beim nächsten Versuch nicht mehr ausführt.

Im iterator sind ja die Schlüssel wenn ich das richtig verstehe bzw. er nimmt sich bei jedem Durchlauf immer den nächsten Schlüssel?
Also müsste ich den Iterator auf den letzten Schlüssel setzen?
 
Das alles ist nur schwer zu verstehen. Man sollte sowohl alle vorderen wie auch alle hinteren Elemente betrachten. Elemente ist hier vielleicht das falsche Wort. Sehen wir uns den Aufbau einer HashMap an. Es gibt keys (Schlüssel, eindeutig) und values (Werte, dürfen mehrfach vorkommen). Matrikelnummern unterscheiden sich also alle voneinander, sonst würde es nicht funktionieren. Statt nur Strings zu verwenden, sollte man lieber Ganzzahldatentyp wählen, denn dabei gibt es beim Parsen der Benutzereingabe weniger Fehler. Wenn eine Matrikelnummer (key) gefunden wurde, kann der entsprechende Name (value) dem Benutzer dargestellt werden. Schleifen terminieren steht überall im Netz. Z.B.: Variable einführen und immer prüfen, mit return sofort die Methode verlassen, die eigentlich schon vorhanden Zählervariabel ändern, damit diese nach der nächsten Prüfung zum Verlassen der Methode führt - oder eine Ausnahme (Exception) erstellen oder eine bereits generierte weitergeben.
 
Die Schildkröte hat mich abgelenkt und ich habe was vergessen: mit break oder mit continue kann ebenfalls eine Schleife verlassen werden. Wenn ich allerdings irgendwo 'ne Methode sehe, die mit einem stattdessen auch möglichen return mit einem break verlassen wurde,... wie auch immer. Häufig ist es überflüssig.
 

Neue Themen


Zurück
Oben