Key-Value-Objekte in Map

Status
Nicht offen für weitere Antworten.

Sindbad1983

Top Contributor
So ich hab mich mit meinem Beispiel jetzt noch ein wenig gespielt, bzw. modifiziert:

Ich hab die contains-Methode geringfügig verändert, und jetzt funktioniert sie nicht mehr!
Kann mir bitte jemand sagen, warum?
Stimmt der Rückgabewert nicht, oder hab ich was übersehen? :bahnhof:

Code:
import java.util.*;


public class Map{

	LinkedList list=new LinkedList();
	KeyValuePair pair;

	public void add(Object key,Object value){

		if(list.contains(key)){
			pair.setValue(value);
		}
		else{
			list.add(new KeyValuePair(key,value));
		}



	}


	public boolean contains(Object key){
		
		Iterator it=list.iterator();
		while(it.hasNext()){
			pair=(KeyValuePair) it.next();
			if(pair.getKey().equals(key)){
				return true;
			}
		}
		return false;
	}


	public String toString(){

		StringBuffer sb=new StringBuffer();
		KeyValuePair pair;
		String s;

		Iterator it=list.iterator();
		while(it.hasNext()){
			pair=(KeyValuePair) it.next();
			s=""+pair.getKey()+""+pair.getValue()+" ";
			sb.append(s);
		}

		s=sb.toString();
		return s;
	}
}

---------------------------------------------

die anderen 2 Klassen bleiben gleich! :)


danke,mahlzeit!!
 

Sindbad1983

Top Contributor
nein..danke Wildcard..hat sich schon erledigt!


Ich hab heut den ganzen Tag programmiert und mein Bestes gegeben!
->damit du siehst, dass ich fleißig war und nicht so schnell aufgib! :wink:


Code:
import java.util.*;


public class Map{

	LinkedList list=new LinkedList();


	public void add(Object key,Object value){

		KeyValuePair pair=(KeyValuePair)contains(key);


		if(pair!=null){
			pair.setValue(value);
		}
		else{
			list.add(new KeyValuePair(key,value));
		}
	}

	public void delete(Object key){

		KeyValuePair pair;

		pair=(KeyValuePair)findKeyValue(key);

		list.remove(pair);
	}


	public int giveSize(){
		int cnt=0;

		Iterator it=list.iterator();
		while(it.hasNext()){
			it.next();
			cnt++;
		}
		return cnt;
	}


	public boolean isEmpty(){

		if(list.size()==0) {
			return true;
		}

		return false;

	}


	public Object findKeyValue(Object key){

		KeyValuePair pair;

		Iterator it=list.iterator();
			while(it.hasNext()){
				pair=(KeyValuePair)it.next();

				if(pair.getKey()==key){
					return pair;
				}
			}
			return null;

	}


	public Object contains(Object key){

		KeyValuePair pair;
		Iterator it=list.iterator();
		while(it.hasNext()){
			pair=(KeyValuePair) it.next();
			if(pair.getKey().equals(key)){
				return pair;
			}
		}
		return null;

	}


	public Object findValue(Object key){

		KeyValuePair pair;

		Iterator it=list.iterator();
		while(it.hasNext()){
			pair=(KeyValuePair) it.next();

			if(pair.getKey().equals(key)){
				return pair.getValue();
			}

		}
		return null;
	}


	public boolean isValueDefined(Object key){

		KeyValuePair pair;

		Iterator it=list.iterator();
		while(it.hasNext()){
			pair=(KeyValuePair) it.next();

			if(pair.getKey().equals(key)){
				if(pair.getValue()!=null){
					return true;
				}
			}
		}
		return false;
	}



	public Object [] getAllKeys(){

		Object [] allKeys=new Object[list.size()];
		Iterator it=list.iterator();
		KeyValuePair pair;
		int cnt=0;

		while(it.hasNext()){
			pair=(KeyValuePair) it.next();
			allKeys[cnt]=pair.getKey();
			cnt++;
		}
		return allKeys;
	}


	public Object [] getAllValues(){

		Object [] allValues=new Object[list.size()];
		KeyValuePair pair;
		int cnt=0;

		Iterator it=list.iterator();
		while(it.hasNext()){
			pair=(KeyValuePair)it.next();

			allValues[cnt]=pair.getValue();
			cnt++;
		}

		return allValues;

	}

	public boolean equals(Map m){
		
		
		
                    //das fehlt noch ->ein Vergleich zweier Maps auf Gleichheit!
		
	}





	public String toString(){

		StringBuffer sb=new StringBuffer();
		KeyValuePair pair;
		String s;

		Iterator it=list.iterator();
		while(it.hasNext()){
			pair=(KeyValuePair) it.next();
			s=""+pair.getKey()+""+pair.getValue()+" ";
			sb.append(s);
		}

		s=sb.toString();
		return s;
	}








}

--------------------------


Schaut doch nicht schlecht aus oder?
Es funktioniert alles...hast du noch Verbesserungsvorschläge?
:bae: aber ich bin ehrlich gesagt schon froh, dass es überhaupt was ausgibt! :lol:


Hast du eine Idee, wie ich an die Methode equals(Map p) herangehen könnte?
Es ein bissl schwierig, werds aber vielleicht heut nochmal probieren, wenn ich Zeit hab!

Danke für deine bisherige Hilfe!
ciao,Tommy
 

Wildcard

Top Contributor
Sieht doch schon gut aus! :toll:
Noch ein paar Anmerkungen:
Code:
   public int giveSize(){ 
      int cnt=0; 

      Iterator it=list.iterator(); 
      while(it.hasNext()){ 
         it.next(); 
         cnt++; 
      } 
      return cnt; 
   }
brauchst du gar nicht so komliziert zu machen! Einfach list.size() zurückgeben :wink:

Code:
   public Object findKeyValue(Object key){ 

      KeyValuePair pair; 

      Iterator it=list.iterator(); 
         while(it.hasNext()){ 
            pair=(KeyValuePair)it.next(); 

            if(pair.getKey()==key){ 
               return pair; 
            } 
         } 
         return null; 

   }
Mach diese Methode besser private. Es ist eine interne Hilfsmethode und geht niemanden etwas an.
Auserdem gibst du ein KeyValuePair zurück, deklarierst es aber als Object. Gib lieber gleich ein KeyValuePair zurück, dann sparst du dir auch den späteren cast!

Ansonsten würd ich vorschlagen das du die Methodennamen besser an die vorgaben des List Interfaces anpasst.
Schau dir einfach mal an wie die entsprechenden Methoden in einer echten Hashmap heißen, und benenn deine genauso. Ist aber nur Kosmetik.

Sindbad1983 hat gesagt.:
Hast du eine Idee, wie ich an die Methode equals(Map p) herangehen könnte?
Ist nicht sonderlich kompliziert:
Als erstes prüfst du ob die Länge gleich ist. Wenn nicht direkt false zurückgeben.
Wenn die länge gleich ist prüfst du ob alle Key's identisch sind(und deren entsprechende Values) und wenn nicht false zurückliefern.
 

mic_checker

Top Contributor
Denk auch dran das gewisse Anforderungen an die equals Methode gestellt werden (die oft allerdings nicht beachtet werden).

Hier mal ein Ausschnitt aus Core Java 2 , Volume I :

1) It is reflexive: for any non-null reference x, x.equals(x) should return true.

2) It is symmetric: for any references x and y, x.equals(y) should return true if and only if y.equals(x) returns true.

3) It is transitive: for any references x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.

4) It is consistent: If the objects to which x and y refer haven't changed, then repeated calls to x.equals(y) return the same value.

5) For any non-null reference x, x.equals(null) should return false.

Du bist natürlich nicht gezwungen es so zu programmieren, dass deine equals Methode tatsächlich alle Punkte erfüllt (und eine Äquivalenzrelation bildet) , allerdings schadet es auch nicht ;)

Code:
public boolean equals(Object otherObject)
{
...
}


Was da oben steht hört sich vielleicht auf den ersten Blick etwas kompliziert an, aber was letztendlich dahinter steht ist recht einfach:
- wenn "null" übergeben wird muss die Methode false zurückgeben
- wenn this == otherObject dann true
- etc. pp.

Ist nur als kleiner Hinweis gedacht, lass dich dadurch nicht verwirren.
 

Wildcard

Top Contributor
Ganz einfache Methode die diese Bedingungen erfüllt:
Code:
public boolean equals(Object otherObject) 
{ 
    return otherObject.equals(this);
}
:bae:
 

Sindbad1983

Top Contributor
danke!
ich kann das Beispiel leider erst am Mi fertig machen!
Ich muss schon mit dem nächsten anfangen!
Vielleicht könnt ihr mit bei dem wieder ein bisschen unter die Arme greifen! Ich werd dann gleich ein paar Fragen online stellen!
ciao,Tommy
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben