Map Durchlaufen

nata

Bekanntes Mitglied
Hi Leute,

im lager muss ich Produkte aufnehmen und wenn der Produkt schon vorhanden ist muss ich vermehren und falls nicht muss ich neue aufnehmen. ist das richtig wie ich Map durchlaufe? Leider wird bei mir in der klasse lager auf der zeile 17 feler geworfen wenn ich
Java:
aktuelleProdukt.getAnzahl() += p.getAnzahl()
schreiben möchte.


Java:
public class Produkt {
	private String bezeichnung;
	private int preis;
	private int anzahl;
	private String beschreibung ;

	

	public Produkt(String bezeichnung, int preis, int anzahl,  String beschreibung) throws Exception {
		setAnzahl(anzahl);
		setBezeichnung(bezeichnung);
		setPreis(preis);
		setbeschreibung(beschreibung);

	}
	
	public void setbeschreibung( String beschreibung) throws Exception{
		if(beschreibung == null || beschreibung.length() == 0){
			throw new Exception("beschreibung darf nicht null sein oder die länge 0 haben");
		}
		this.beschreibung = beschreibung;
	}

	public void setAnzahl(int anzahl) throws Exception {
		if (anzahl < 0) {
			throw new Exception("Produkteanzahl darf nicht unter 0 sein");
		}
		this.anzahl = anzahl;
	}

	public int getAnzahl() {
		return anzahl;
	}
	
	 public void aufbuchen(int anzahl)throws Exception{
		 anzahl += getAnzahl();
	 }
	
	 public void abbuchen(int anzahl) throws Exception{
		 if(getAnzahl() < anzahl){
			 throw new Exception("Es ist nicht genuege Menge vorhanden");
		 }
		 anzahl -= getAnzahl();
	 }
	
	private void setBezeichnung(String bezeichnung) throws Exception {
		if (bezeichnung == null) {
			throw new Exception("bezeichnung darf nicht nul sein");
		}
		if(!bezeichnung.matches("[A-Z\\d ]{10}")){
			throw new Exception("bezeichnung soll die Laenge 10 haben und grossbuchstaben, ziffern und leerraum enthalten");
			
		}

		this.bezeichnung = bezeichnung;

	}

	public String getBezeichnung() {
		return bezeichnung;
	}

	public void setPreis(int preis) throws Exception {
		
		if (preis < 1) {
			throw new Exception("Preis muss mehr als 1 cent sein");
		}
		this.preis = preis;
	}

	public int getPreis() {
		return preis;
	}

	public boolean equals(Object obj) {
		if (obj instanceof Produkt) {
			Produkt p = (Produkt) obj;
			return p.bezeichnung.equals(bezeichnung);
		}
		return false;
	}

	public String toString() {
		StringBuilder builder = new StringBuilder();

		return builder.append(bezeichnung).append(", ").append(anzahl)
				.append(" Stueck ,").append(preis).append(" cent/stueck")
				.toString();

	}

}

Java:
import java.util.Collection;
import java.util.HashMap;


public class Lager {
	
	HashMap<String,Produkt > produkte = new HashMap<String ,Produkt>();
	

	public void aufbuchen(Produkt p) throws Exception {
		if(produkte.containsKey(p.getBezeichnung())){
			
			Collection< Produkt> elems = produkte.values();
			
			for(Produkt aktuelleProdukt : elems ){
				if(aktuelleProdukt.getBezeichnung().equals(p.getBezeichnung())){
					aktuelleProdukt.getAnzahl() += p.
				}
			}

		}

		
	}

	public String toString() {
		StringBuilder builder = new StringBuilder();
		
		Collection<Produkt> elems = produkte.values();
		
		for (Produkt p : elems) {
			builder.append(p.toString()).append("\n");
		}
		return builder.toString();
	}

}
 

Cola_Colin

Top Contributor
Java:
aktuelleProdukt.getAnzahl() += p.getAnzahl()
Ist auch Unsinn.

getAnzahl() ist, wie an den Klammern und auch dem Aufbau des Namens zu erkennen ist, eine Methode, genauer ein getter für den Wert Anzahl. Einer Methode kannst du nichts hinzuaddieren.
Ich vermute mal, das du an der Stelle sowas in der Art brauchen wirst:
Java:
aktuellePosition.setAnzahl(aktuellePosition.getAnzahl()+p.getAnzahl());
 
Zuletzt bearbeitet:

nrg

Top Contributor
Java:
aktuelleProdukt.setAnzahl(aktuelleProdukt.getAnzahl() + p.getAnzahl());

vllt auch ne add methode schreiben oder so

edit: zu langsam :(. vorposter hat allerdings 2 Klammern vergessen
edit2: und ich ein = zuviel ;)
 
G

gman

Gast
Hi,

du könntest dir auch die Schleife sparen:

Java:
    public void aufbuchen(Produkt p) throws Exception {
        Produkt tmp = produkte.get(p.getBezeichnung());
        
        if(tmp != null) {
            tmp.setAnzahl(tmp.getAnzahl() + p.getAnzahl());
        } else {
            produkte.put(p.getBezeichnung(), p);
        }
    }
 

nata

Bekanntes Mitglied
ich möchte das Produkt entfernen und wollte das
Java:
public Object remove(Object key)
benützen, aber irgendetwas mache ich falsch weil ich fehlermeldung bekomme, dass Produkt nicht existiert

Java:
public void produktEntfernen(Produkt p) throws Exception{
		if(produkte.containsKey(p.getBezeichnung())){
			
				Collection< Produkt> elems = produkte.values();
			
					for(Produkt aktuellePosition : elems ){
				
						if(aktuellePosition.getBezeichnung().equals(p.getBezeichnung()) ){
							
							elems.remove(aktuellePosition.getBezeichnung());
				
						}
					}
		
				}else{
		   
					throw new Exception("Der Produkt ist nicht vorhanden");
				}
		
	}
lg nata
 

XHelp

Top Contributor
Es wird so nicht klappen, weil du nicht elemente löschen kannst, wärend du über eine Collection iterierst.
Und elems ist eine Collection von Produkt und keine Collection von den Beschreibungen (was ja vermutlich ein String ist)
 

nata

Bekanntes Mitglied
Ich habe in javainsel durchgelesen, aber ich komme mit ProdukteEntfernen immernoch nicht zurecht.kann mir jemand einen tipp geben?
danke vielmals
 

Jedit

Aktives Mitglied
Also ich hab irgendwie den Überblick über deine Collectiosn verloren. Aber falls du 2 Collections haben solltest, eine mit allen Produkten und eine mit den Produkten die gelöscht werden sollen, zB

ArrayList<Produkt> alleProdukte = new ArrayList<Produkt>();
ArrayList<Produkt> zuLoeschen = new ArrayList<Produkt>();

könntest du das wie folgt abarbeiten:

Java:
for(Produkt p : zuLoeschen) {
   alleProdukte.remove(p);
}

Einzige Bedingung dafür ist, dass du gegebenenfalls equals und hash code in deiner Produkt Klasse überschreibst, damit 2 Produkte entweder gleich sind, wenn die Bezeichnung gleich ist, oder eine Produktnummer, odre was immer du willst.

Edit: Aso hab grad gesehn du hast ne HashMap<String, Produkt> alleProdukte, für alle Produkte und eine Collection<Produkt> zuLoeschen, für die zu löschenden? Der Key (String) in der HashMap ist die Produktbezeichnung?

dann eher:

Java:
for(Produkt p : zuLoeschen) {
   alleProdukte.remove(p.getBezeichnung());
}
 
Zuletzt bearbeitet:

nata

Bekanntes Mitglied
da ist meine code
wie du sagtest methode ProduktEntfernen ist kommpleter blödsinn und wenn ich abbuchen so löse wird feler geworfen und zu
Java:
for(Produkt p : produkte.values() )
zeile gezeigt


Java:
 import java.util.Collection;
import java.util.HashMap;



public class Lager {
	
	HashMap<String,Produkt > produkte = new HashMap<String ,Produkt>();
	
	public void aufbuchen(Produkt prod) throws Exception {
		if(prod == null){
			throw new Exception("Produkt darf nicht null sein");
		}
		if(produkte.containsKey(prod.getBezeichnung())){
			
	
			for(Produkt p : produkte.values() ){
				if(p.getBezeichnung().equals(prod.getBezeichnung())){
					p.setAnzahl(p.getAnzahl() + prod.getAnzahl());
				
				}
			}

			}else{
		
				produkte.put(prod.getBezeichnung(), prod);
				}
	}
	
	public void abbuchen(Produkt prod) throws Exception {
		if(prod == null){
			throw new Exception("Produkt darf nicht null sein");
		}
		if(produkte.containsKey(prod.getBezeichnung())){
	
			for(Produkt p : produkte.values() ){
				if(p.getBezeichnung().equals(prod.getBezeichnung())){
					if(p.getAnzahl()>prod.getAnzahl()){
					p.setAnzahl(p.getAnzahl() - prod.getAnzahl());
					}else if(p.getAnzahl()== prod.getAnzahl()){
				
						produkte.remove(p.getBezeichnung());
					}else{
						throw new Exception("Es gibt nicht genügend Produkte Vorhanden");
					}
				}
			}

			}else{
		
				throw new Exception("Das Produkt ist nicht vorhanden");
				}
	   }
		
	   
	
	/*
	public void produktEntfernen(Produkt p) throws Exception{
		if(produkte.containsKey(p.getBezeichnung())){
			
				Iterator<String> elems = produkte.keySet().iterator();
	
				while(elems.hasNext()){
							
					String aktuelleBezeichnung = elems.next();
					if(aktuelleBezeichnung.equals(p.getBezeichnung())){	
						produkte.remove(aktuelleBezeichnung);
					}
					
		
				}
		}
		
		else{
			   
			throw new Exception("Der Produkt ist nicht vorhanden");
		}
	}
	*/

	public String toString() {
		StringBuilder builder = new StringBuilder();
		
		Collection<Produkt> elems = produkte.values();
		
		for (Produkt p : elems) {
			builder.append(p.toString()).append("\n");
		}
		return builder.toString();
	}

}
 
Zuletzt bearbeitet:

nata

Bekanntes Mitglied
Hallo Leute,
Produkt entfernen habe ich erledigt und mein code schaut so aus
Java:
public void produktEntfernen(Produkt prod) throws Exception{
		if(produkte.containsKey(prod.getBezeichnung())){
					produkte.keySet().remove(prod.getBezeichnung());	

			}else{
		
				throw new Exception("Das Produkt ist nicht vorhanden");
				}
	}

aber wenn ich abbuchen teste bekomme ich fehlermeldung und werde ich auf die zeile
Java:
for(Produkt p : produkte.values() )
hingewiesen

Java:
public void abbuchen(Produkt prod) throws Exception {
		if(prod == null){
			throw new Exception("Produkt darf nicht null sein");
		}
		if(produkte.containsKey(prod.getBezeichnung())){
	
			for(Produkt p : produkte.values() ){
				if(p.getBezeichnung().equals(prod.getBezeichnung())){
					if(p.getAnzahl()>prod.getAnzahl()){
					p.setAnzahl(p.getAnzahl() - prod.getAnzahl());
					}else if(p.getAnzahl()== prod.getAnzahl()){
				
						produkte.keySet().remove(prod.getBezeichnung());
					}else{
						throw new Exception("Es gibt nicht genügend Produkte Vorhanden");
					}
				}
			}

			}else{
		
				throw new Exception("Das Produkt ist nicht vorhanden");
				}
	   }
wo liegt das Problem?
 

XHelp

Top Contributor
Meine Kristalkugel sagt mir, dass es sich vermutlich um eine ConcurrentModificationException handelt.
Du kannst nicht mit eine Iterator durch eine Liste gehen und aus der Liste dann Elemente löschen.
 

nata

Bekanntes Mitglied
dein Kristalkugel wirkt wunder.Der fehlermeldung ist das was du erwänt hast, aber ich habe eine frage.ich brauche prod mir p vergleich und wie kann ich p definieren?
 

nata

Bekanntes Mitglied
bei mir geht es darum dass ich produkt abbuchen mochte
Java:
public void abbuchen(Produkt prod)

und ich muss anzahl von prod vergleichen mit dem produkt der in map ist. wie kann ich in map stehende produkt definieren?
 

XHelp

Top Contributor
Im Grunde kannst du die Logik deiner Methode beibehalten, nur eben die Schleife abändern, so dass du den Iterator manuell mit
Code:
produkte.value().iterator()
holst und zum löschen die remove Methode des Iterators benutzt.
Aber generell zum Ablauf: es macht kein Sinn eine Map zu benutzen, wenn du ständig durch sie durchiterieren musst. Du kannst ja mit
Code:
.get(key)
auf ein Element zugreifen
 
M

Marcinek

Gast
Könnte sein, dass nur ich den eklatanten Fehler sehe?

Wenn ich eine MAP habe, welche jeden Eintrag (VALUE) durch einen Schlüssel (KEY) beschreibt, dann

1. Muss ich einen Key suchen, der für alle Objekte möglichst einzigartig ist, => Artikelnummer?
2. Entferne ich den Artikel via meineMap.remove(KEY); (KEINE ITERATION ÜEBR MAP)
3. Schauen ob was drin ist: meineMap.containsKey();

Wenn du über die MAP iterieren willst, dann holst du dir ein KEYSET und schaust mit allen Keys was drin ist, dann kannst du dort auch sachen entfernen bei bedarf, die anderen Kriterien entsprechen.

AFAIK ist deine Lösung naja nicht wirklich falsch, aber javatechnisch völlig falsch implementiert.:rtfm:
 

nata

Bekanntes Mitglied
produktEntfernen ist schon korrekt oder?
ich schaue dass ich abbuchen so implementiere wie du gesagt hast

danke euch vielmals

lg nata
 
M

Marcinek

Gast
nein, Produkt entfernen ist so nicht richtig.

Ich weiß gar nicht, ob die Operationen auf dem KeySet sich auf die MAP auswirken.

Produktabbuchen ist auch viel zu umständiclh

Einfach:

Java:
Produkt einProdukt = meineMap.get(p.getBeschreibung);
einProdukt.setAnzahl(einProdukt.getAnzahl() - prod.getAnzahl();
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Bugs Bunny Fehlerhafte Berechnung beim erneuten Durchlaufen der Schleife Java Basics - Anfänger-Themen 5
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
TimoN11 Array -> Schleife wieder von vorne durchlaufen lassen Java Basics - Anfänger-Themen 1
E Timer trotz erwartender Eingabe durchlaufen lassen Java Basics - Anfänger-Themen 11
E Baum pfadweise durchlaufen Java Basics - Anfänger-Themen 11
S Array X-mal durchlaufen und dann N-mal durchlaufen Java Basics - Anfänger-Themen 20
W Eigener Iterator soll mehrdimensionales Array durchlaufen Java Basics - Anfänger-Themen 4
B Klassen Alle Unter-Objekte durchlaufen in der Hauptklasse Java Basics - Anfänger-Themen 10
I Methoden Schleife immer wieder durchlaufen lassen Java Basics - Anfänger-Themen 15
S Rekursives Durchlaufen eines Verzeichnisses - AccessDeniedException behandeln Java Basics - Anfänger-Themen 1
T Objekt-Arrays mit einer Schleife durchlaufen/ausgeben Java Basics - Anfänger-Themen 2
B Durchlaufen von Hashmap und Arraylist Java Basics - Anfänger-Themen 8
B OOP Liste durchlaufen Java Basics - Anfänger-Themen 12
G Mehrere If-else-Sätze der Reihe nach durchlaufen lassen Java Basics - Anfänger-Themen 2
C Laufzeitverhalten beim zeilenweise durchlaufen eines 2 dimensional array Java Basics - Anfänger-Themen 6
W If_Bedingung in statischer Methode beim zweiten Mal nicht durchlaufen Java Basics - Anfänger-Themen 14
L Klassen nacheinander durchlaufen? Java Basics - Anfänger-Themen 5
A do while Schleife wird 2 mal durchlaufen Java Basics - Anfänger-Themen 3
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
K Stammbaum durchlaufen (Iteration etc) Java Basics - Anfänger-Themen 9
D HashMap Keys durchlaufen Java Basics - Anfänger-Themen 2
R Switch: Nach durchlaufen des Case wieder zum Menü Java Basics - Anfänger-Themen 3
S Methoden Return Anweisung beendet Methode nicht, stattdessen wird diese zweimal durchlaufen Java Basics - Anfänger-Themen 3
A Array wird nicht durchlaufen Java Basics - Anfänger-Themen 10
A Treeset per For-Schleife durchlaufen Java Basics - Anfänger-Themen 2
K Objektbaum durchlaufen Java Basics - Anfänger-Themen 7
S Erfahrungswerte von schnelles durchlaufen von Listen mit 2 Werten Java Basics - Anfänger-Themen 10
A Datentypen Iterator von hinten nach vorne durchlaufen Java Basics - Anfänger-Themen 4
M Zweidimensionales Array durchlaufen Java Basics - Anfänger-Themen 4
C dynamische JTextFields durchlaufen Java Basics - Anfänger-Themen 5
J äußere for schleife wird nur einmal durchlaufen Java Basics - Anfänger-Themen 8
T Datentypen Verschachtelte Map durchlaufen Java Basics - Anfänger-Themen 4
R Fehler in Rekursion (Unterordner durchlaufen) Java Basics - Anfänger-Themen 2
J Problem Arraylist durchlaufen Java Basics - Anfänger-Themen 7
K methode wird nur einmal korrekt durchlaufen Java Basics - Anfänger-Themen 4
B Array durchlaufen und sortieren Java Basics - Anfänger-Themen 9
N HashMap mit Iterator durchlaufen Java Basics - Anfänger-Themen 11
P Klassen-konstanten durchlaufen Java Basics - Anfänger-Themen 9
M Durchlaufen von Sets Java Basics - Anfänger-Themen 11
H Monat durchlaufen Java Basics - Anfänger-Themen 2
W Textfiles durchlaufen Java Basics - Anfänger-Themen 11
M Durchlaufen eines Verzeichnisbaums Java Basics - Anfänger-Themen 5
G Rekursion mit Return - Baum durchlaufen Java Basics - Anfänger-Themen 4
F Objektnamen mit Schleife durchlaufen. Java Basics - Anfänger-Themen 10
G [Threads]: Mit mehreren Threads 1 ArrayList durchlaufen Java Basics - Anfänger-Themen 19
G HashMap durchlaufen und alle keys mit values ausgeben Java Basics - Anfänger-Themen 4
M Variablen einer Klasse zu durchlaufen möglich? Java Basics - Anfänger-Themen 5
K 2D Array spaltenweise durchlaufen Java Basics - Anfänger-Themen 4
G Baumstruktur rekursiv durchlaufen Java Basics - Anfänger-Themen 2
M Textfile durchlaufen und ersetzen Java Basics - Anfänger-Themen 2
M textboxen mit schleife durchlaufen. Java Basics - Anfänger-Themen 5
G Alle Componente eines JFrame durchlaufen Java Basics - Anfänger-Themen 3
P Schleife wird falsch durchlaufen!? Java Basics - Anfänger-Themen 3
H HashMap durchlaufen Java Basics - Anfänger-Themen 4
M Verzeichnisse rekursiv durchlaufen und dann RegEx Java Basics - Anfänger-Themen 6
J Durchlaufen von Vektoren Java Basics - Anfänger-Themen 14
G Array mit Schleife durchlaufen - guter Stil? Java Basics - Anfänger-Themen 20
K durchlaufen einer methode zählen Java Basics - Anfänger-Themen 15
M for-Schleife und Variablen automatisch durchlaufen Java Basics - Anfänger-Themen 2
W Baum durchlaufen Java Basics - Anfänger-Themen 3
M String mit For Each durchlaufen Java Basics - Anfänger-Themen 4
E liste rekursiv durchlaufen? Java Basics - Anfänger-Themen 3
S NameValuePair durchlaufen Java Basics - Anfänger-Themen 4
D Verzeichnisse rekursiv durchlaufen Java Basics - Anfänger-Themen 3
M HashMap durchlaufen: Was stimmt nicht? Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben