# Was ist ein HashSet?



## Limon (15. Mrz 2006)

Ich weiss nur so viel, dass man im HashSet Daten ablegen kann. Ich hab folgenden Quelltext:


```
public class HashSetTest{
	
			
		private String name="";
		private int preis;
		private int anzahl;
		
		
	public	HashSetTest (String n, int p, int a) {
		
		this.name=n;
		this.preis=p;
		this.anzahl=a;
	}
	
	public static void main (String[]args){
		
	HashSetTest ding1 = new HashSetTest ("IPod", 199, 2);
	HashSetTest ding2 = new HashSetTest ("JavaBuch", 29, 1);
	HashSetTest ding3 = new HashSetTest ("Notebook", 1069, 1);	

				
	}
}
```

Meine Aufgabe ist es einen
HashSet meineDinger
zu erstellen und die drei Sachen dort abzulegen. In meinem Buch steht nichts über HashSet. Kann mir einer helfen?

Danke.


----------



## bygones (15. Mrz 2006)

suchfunktion, faq: http://www.java-forum.org/de/viewtopic.php?p=117258 und API.... einfach dort mal gucken und lesen....


----------



## Limon (15. Mrz 2006)

Ok, Danke...jetzt kenne ich die Theorie, ich kann sie aber nicht anwenden, vielleicht kann mir einer a meinem Beispiel zeigen wie es geht?!


----------



## mikachu (15. Mrz 2006)

java.sun.com

ist die korrekte beschreibung und funktionsweise


----------



## Limon (15. Mrz 2006)

```
public class HashSetTest{
	
			
		private String name="";
		private int preis;
		private int anzahl;
		
		
	public	HashSetTest (String n, int p, int a) {
		
		this.name=n;
		this.preis=p;
		this.anzahl=a;
	}
	
	
	
	public static void main (String[]args){
		
	HashSetTest ding1 = new HashSetTest ("IPod", 199, 2);
	HashSetTest ding2 = new HashSetTest ("JavaBuch", 29, 1);
	HashSetTest ding3 = new HashSetTest ("Notebook", 1069, 1);	

	HashSet meineDinger = new HashSet();

				
	}
}
```

Zeile 24 bringt immer eine Fehlermeldung: cannot find symbol class HashSet


----------



## norman (15. Mrz 2006)

import java.util.*; ? :roll:


----------



## Limon (15. Mrz 2006)

oh, danke


```
import java.util.*;
public class HashSetTest{
	
			
		private String name="";
		private int preis;
		private int anzahl;
		
		
	public	HashSetTest (String n, int p, int a) {
		
		this.name=n;
		this.preis=p;
		this.anzahl=a;
	}
	
	
	
	public static void main (String[]args){
		
	HashSetTest ding1 = new HashSetTest ("IPod", 199, 2);
	HashSetTest ding2 = new HashSetTest ("JavaBuch", 29, 1);
	HashSetTest ding3 = new HashSetTest ("Notebook", 1069, 1);	

	HashSet meineDinger = new HashSet();
	
	meineDinger.add(ding1);
	

				
	}
}
```

Zeile 28 macht Probleme: 
HashSetTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

was heisst das?


----------



## mikachu (15. Mrz 2006)

```
import java.util.HashSet;

public class HashSetTest {

	HashSetTest(){}

	public static void main(String[] args) {
		HashSet<Ding> hashSet = new HashSet<Ding>();

		hashSet.add( new Ding( "IPod", 199, 2 ) );
		hashSet.add( new Ding( "JavaBuch", 29, 1 ) );
		hashSet.add( new Ding( "Notebook", 1069, 1 ) );
	}

}

class Ding
{
	String name;
	int preis, anzahl;

	Ding(String n, int p, int a)
	{
		name	= n;
		preis	= p;
		anzahl	= a;
	}
}
```

was die fehlermeldung zu sagen hat, weiß ich auch nicht...


----------



## Leroy42 (15. Mrz 2006)

Das liegt daran, daß du seit Java 1.5 den Typ der Objekte angeben kannst, die in dein Hashset _reindürfen_.
Früher konntest du in die Collections alles kunterbunt reinwerfen. 3 Lösungen.

1. Definiere HashSet<HashSetTest> meineDinger = new HashSet<HashSetTest>(); um nur Instanzen von
   HashSetTest (und deren Unterklassen) zu erlauben.

2. Definiere HashSet<Object> meineDinger = new HashSet<HashSetTest>(); um nur alles zu erlauben.

3. Beim Übersetzen die Option angeben, die javac mitteilt für Version 1.4 zu übersetzen.


----------



## Limon (15. Mrz 2006)

mika hat gesagt.:
			
		

> ```
> import java.util.HashSet;
> 
> public class HashSetTest {
> ...



sieht vernünftig aus, nur versehe ich die Zeile 5 nicht. Ohne sie geht's nicht?


----------



## bygones (15. Mrz 2006)

schau nochmal in dein Java Buch und lese alles über die Grundlagen....

1. die meldung von java ist kein fehler, sondern nur eine Warnung (siehe Leroys post)
2. Zeile 5 nennt sich Konstruktor, der da er hier keine extra Aufgabe erfüllt nicht nötig ist, ansonsten aber die initiierung eines Objektes definiert.

wie gesagt - steht alles in den Büchern  :wink:


----------



## Limon (24. Mrz 2006)

jetzt muss ich eine Methode:  *filter (Collection coll, String verdaechtig)*   schreiben, die alle verdächtigen Elemente rausfiltert.

Nach stundenlangem Kopfzerbrechen hab ich doch entschlossen hier reinzuschreiben.

Weiss jemand wie es geht?

Danke im voraus.


----------



## byte (24. Mrz 2006)

Wir lösen keine Hausaufgaben.


----------



## bygones (24. Mrz 2006)

übers set iterieren, objekte vergleichen, elemente löschen.....


----------



## Limon (24. Mrz 2006)

```
import java.util.HashSet; 

 class HashSetTest { 
 
   public static void main(String[] args) { 
      HashSet<Ding> meineDinger = new HashSet<Ding>(); 

      meineDinger.add( new Ding( "IPod", 199, 2 ) ); 
      meineDinger.add( new Ding( "JavaBuch", 29, 1 ) ); 
      meineDinger.add( new Ding( "Notebook", 1069, 1 ) ); 
     
   } 


	static void filter(Collection coll, String verdaechtig) {
		
		Iterator it= meineDinger.iterator();
		while(it.equals("verdaechtig")) 
		System.out.print("Der Inhalt ist verdaechtig");
		
		}

} 

class Ding {
	 
   String name; 
   int preis; 
   int anzahl; 

   Ding(String n, int p, int a) {
   	 
      this.name   = n; 
      this.preis   = p; 
      this.anzahl   = a; 
   } 
}
```

so ähnlich?


----------



## bygones (24. Mrz 2006)

naja - fast ähnlich.

schau dir den Iterator nochmals an
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Iterator.html
http://www.galileocomputing.de/open...el_11_000.htm#Rxx365java110000400036F1F01B105

du vergleichst bei dir den iterator, du musst aber die elemente des iterators vergleichen.....


----------



## Limon (26. Mrz 2006)

```
import java.util.*; 

 class HashSetTest { 
 
   public static void main(String[] args) { 
      HashSet<Ding> meineDinger = new HashSet<Ding>(); 

      meineDinger.add( new Ding( "IPod", 199, 2 ) ); 
      meineDinger.add( new Ding( "JavaBuch", 29, 1 ) ); 
      meineDinger.add( new Ding( "Notebook", 1069, 1 ) ); 
     
     meineDinger.ausgeben();
   } 
    
   public void ausgeben(){
   	System.out.print(this.name+":\t");
   	Iterator it = this.meineDinger.iterator();
   	while (it.hasNext())
   	System.out.print(it.next()+" ");
   	System.out.println("\n");
   }
} 

class Ding {
	 
   String name; 
   int preis; 
   int anzahl; 

   Ding(String n, int p, int a) {
   	 
      this.name   = n; 
      this.preis   = p; 
      this.anzahl   = a; 
   } 
}
```

also das läuft auch nicht...warum?


----------



## Guest (27. Mrz 2006)

läuft nicht, weil:

ad 1) du versuchst, in der methode ausgeben() auf objekte zuzugreifen, die nur, und nur in main instantiiert worden sind, und welche auch somit nur und nur dort gültig sind.

ad 2) du in der o.g. methode auf ein attribute namens "name" versuchst zuzugreifen, du aber das attribut in der klasse Ding meinst.

 => meine schlussfolgerung(en):
 1. dir ist der objektorientierte gedanke noch nicht so richtig klar geworden
 2. wenn ihr das in der schule / uni behandelt, ist irgendwann davor schonmal auf das thema genauer eingegangen...


----------



## mikachu (27. Mrz 2006)

die methode ausgeben() ist leicht zu implementieren...


```
public void ausgeben(){
		Iterator<Ding> it = this.meineDinger.iterator();
		while ( it.hasNext() )
		{
			Ding temporaeresDing = it.next();
			System.out.print( "Titel: " + temporaeresDing.name +
							  " -> Preis: " + temporaeresDing.preis +
							  " -> Anzahl: " + temporaeresDing.anzahl );
			System.out.println();
		}
	}
```

hierbei muss 'meineDinger' als Klassenattribut deklariert werden :!:

jetzt frag ich mich nur noch, was du mit deiner methode filter() für Dinge filtern willst.
wo der name mit verdaechtig übereinstimmt?

MfG mika


----------



## Limon (27. Mrz 2006)

```
import java.util.*; 

 class HashSetTest { 
 
   public static void main(String[] args) { 
      HashSet<Ding> meineDinger = new HashSet<Ding>(); 

      meineDinger.add( new Ding( "IPod", 199, 2 ) ); 
      meineDinger.add( new Ding( "JavaBuch", 29, 1 ) ); 
      meineDinger.add( new Ding( "Notebook", 1069, 1 ) ); 
     
     
   } 
    
   public void ausgeben(){ 
      Iterator<Ding> it = this.meineDinger.iterator(); 
      while ( it.hasNext() ) 
      { 
         Ding temporaeresDing = it.next(); 
         System.out.print( "Titel: " + temporaeresDing.name + 
                       " -> Preis: " + temporaeresDing.preis + 
                       " -> Anzahl: " + temporaeresDing.anzahl ); 
         System.out.println(); 
      } 
   }

} 

class Ding {
	 
   String name; 
   int preis; 
   int anzahl; 

   Ding(String n, int p, int a) {
   	 
      this.name   = n; 
      this.preis   = p; 
      this.anzahl   = a; 
   } 
}
```

Zeile 16 macht Probleme: "cannot find symbol variable meineDinger"


mit *filter (Collection coll, String verdaechtig)* meine ich eine Methode, die registriert ob der String-Wert "verdaechtig" entspricht und entfernt es.


----------



## bygones (27. Mrz 2006)

meineDinger (was für ein name btw ^^) ist eine lokale Variable in der main methode, daher kann sie keine andere methode kennen.

Entweder du übergibst meineDinger der ausgeben methode als parameter oder machst meineDinger zu einer globalen variable


----------



## Limon (28. Mrz 2006)

```
import java.util.*; 

 class HashSetTest { 
 
 HashSet<Ding> meineDinger = new HashSet<Ding>();
  
   public static void main(String[] args) { 
      
    HashSet<Ding> meineDinger = new HashSet<Ding>(); 
      meineDinger.add( new Ding( "IPod", 199, 2 ) ); 
      meineDinger.add( new Ding( "JavaBuch", 29, 1 ) ); 
      meineDinger.add( new Ding( "Notebook", 1069, 1 ) ); 
      
      meineDinger.ausgeben();
    } 
     
  
    
   public void ausgeben(){ 
      Iterator<Ding> it = this.meineDinger.iterator(); 
      while ( it.hasNext() ) 
      { 
         Ding temporaeresDing = it.next(); 
         System.out.print( "Name: " + temporaeresDing.name + 
                       " -> Preis: " + temporaeresDing.preis + 
                       " -> Anzahl: " + temporaeresDing.anzahl ); 
         System.out.println(); 
      } 
   }

} 


class Ding {
	 
   String name; 
   int preis; 
   int anzahl; 

   Ding(String n, int p, int a) {
   	 
      this.name   = n; 
      this.preis   = p; 
      this.anzahl   = a; 
   } 
}
```

wie kann ich die Methode *ausgeben* anwenden? So wie ich's in Zeile 14 gemacht habe ist ja falsch.


----------



## bygones (28. Mrz 2006)

1. möglichkeit:

```
meineDinger.ausgeben(meinDinger); 
}
public void ausgeben(HashSet dieDinger){
 Iterator<Ding> it = dieDinger.iterator();
 //....
}
```

2. möglichkeit:

```
class HashSetTest { 

HashSet<Ding> meineDinger; 
  
   public static void main(String[] args) { 
   
    meineDinger = new HashSet<Ding>(); 
      meineDinger.add( new Ding( "IPod", 199, 2 ) ); 
      meineDinger.add( new Ding( "JavaBuch", 29, 1 ) ); 
      meineDinger.add( new Ding( "Notebook", 1069, 1 ) ); 
      
      meineDinger.ausgeben(); 
    }
```


----------



## Limon (30. Mrz 2006)

Sorry wenn ich nerve, aber das beschissene Programm will einfach nicht funktionieren. Eine Woche sitze ich schon an ihr. Zeile 14 ist offenbar wieder falsch.


```
import java.util.*; 

 class HashSetTest { 
 
 HashSet<Ding> meineDinger = new HashSet<Ding>();
  
   public static void main(String[] args) { 
      
    HashSet<Ding> meineDinger = new HashSet<Ding>(); 
      meineDinger.add( new Ding( "IPod", 199, 2 ) ); 
      meineDinger.add( new Ding( "JavaBuch", 29, 1 ) ); 
      meineDinger.add( new Ding( "Notebook", 1069, 1 ) ); 
      
      meineDinger.ausgeben(Ding); 

    } 
     
  
    
   public void ausgeben(HashSet meineDinger){ 
      Iterator<Ding> it = this.meineDinger.iterator(); 
      while ( it.hasNext() ) 
      { 
         Ding temporaeresDing = it.next(); 
         System.out.print( "Name: " + temporaeresDing.name + 
                       " -> Preis: " + temporaeresDing.preis + 
                       " -> Anzahl: " + temporaeresDing.anzahl ); 
         System.out.println(); 
      } 
   }

} 


class Ding {
	 
   String name; 
   int preis; 
   int anzahl; 

   Ding(String n, int p, int a) {
   	 
      this.name   = n; 
      this.preis   = p; 
      this.anzahl   = a; 
   } 
}
```


----------



## tini (30. Mrz 2006)

Du hast genau zwei Möglichkeiten.

1.:
Zeile 9: Entferne "HashSet<Ding>"
Zeile 14: Ersetze durch 
	
	
	
	





```
ausgeben();
```
Zeile 20: Entferne "HashSet meineDinger"

2.:
Zeile 5: Entferne komplette Zeile
Zeile 14: Ersetze durch 
	
	
	
	





```
ausgeben(meineDinger);
```
Zeile 21: Entferne "this."


----------



## Caffè Latte (30. Mrz 2006)

Ist ja ein dickes Ding dieser Thread ... 

*SCNR*


----------



## tini (30. Mrz 2006)

Na ja, ich hoffe, dass wir es nun bald hinter uns haben!


----------



## Limon (30. Mrz 2006)

tini hat gesagt.:
			
		

> Du hast genau zwei Möglichkeiten.
> 
> 1.:
> Zeile 9: Entferne "HashSet<Ding>"
> ...



beides mal hab ich die Fehlermeldung: non-statis variable meineDinger cannot be referenced from a static context

ich geb's auf


----------



## tini (31. Mrz 2006)

Aufgegeben wird hier nicht!  :meld: 

Dann mach mal folgendes (zusätzlich zu Möglichkeit 1 oder 2 von gestern):
Zeile 7: Ersetze diese Zeile durch
	
	
	
	





```
public HashSetTest() {
```
Mach ne neue main-Methode:

```
public static void main(String[] args) {
HashSetTest test = new HashSetTest();
}
```

Das funktioniert dann.


----------



## Limon (2. Apr 2006)

@ tini, vielleicht könntest es selber verbessern und testen, wäre echt nett, brauche das dringend
Danke



```
public class HashSetTest { 
 
 
  HashSet<Ding> meineDinger = new HashSet<Ding>(); 
  
   public HashSetTest { 
      
      public static void main(String[] args){
      
      meineDinger.add(new Ding( "IPod", 199, 2 ) ); 
      meineDinger.add(new Ding( "JavaBuch", 29, 1 ) ); 
      meineDinger.add(new Ding( "Notebook", 1069, 1 ) ); 
      
      ausgeben(); 

    } 
     
 }
    
   public void ausgeben(){ 
      Iterator<Ding> it = this.meineDinger.iterator(); 
      while ( it.hasNext() ) 
      { 
         Ding temporaeresDing = it.next(); 
         System.out.print( "Name: " + temporaeresDing.name + 
                       " -> Preis: " + temporaeresDing.preis + 
                       " -> Anzahl: " + temporaeresDing.anzahl ); 
         System.out.println(); 
      } 
   }

} 


class Ding {
	 
   String name; 
   int preis; 
   int anzahl; 

   Ding(String n, int p, int a) {
   	 
      this.name   = n; 
      this.preis   = p; 
      this.anzahl   = a; 
   } 
}
```


----------



## Limon (5. Apr 2006)

dann nicht


----------



## tini (6. Apr 2006)

Also gut, weil du es bist  :wink: 

```
import java.util.*; 

class HashSetTest { 

HashSet<Ding> meineDinger = new HashSet<Ding>(); 
  
	public HashSetTest() {
		meineDinger = new HashSet<Ding>(); 
	    meineDinger.add( new Ding( "IPod", 199, 2 ) ); 
	    meineDinger.add( new Ding( "JavaBuch", 29, 1 ) ); 
	    meineDinger.add( new Ding( "Notebook", 1069, 1 ) ); 
	      
	    ausgeben(); 
	}

   public static void main(String[] args) { 
      HashSetTest test = new HashSetTest();
   } 
      
  
    
   public void ausgeben(){ 
      Iterator<Ding> it = meineDinger.iterator(); 
      while ( it.hasNext() ) 
      { 
         Ding temporaeresDing = it.next(); 
         System.out.print( "Name: " + temporaeresDing.name + 
                       " -> Preis: " + temporaeresDing.preis + 
                       " -> Anzahl: " + temporaeresDing.anzahl ); 
         System.out.println(); 
      } 
   } 

} 


class Ding { 
    
   String name; 
   int preis; 
   int anzahl; 

   Ding(String n, int p, int a) { 
       
      this.name   = n; 
      this.preis   = p; 
      this.anzahl   = a; 
   } 
}
```
Und sei nicht so ungeduldig. Ich muss nebenbei auch noch ein bissl arbeiten.
EDIT: wenn du dich GENAU an meine Anweisungen gehalten hättest, hättest du es auch selber hinbekommen.  :bae:


----------



## bygones (6. Apr 2006)

Limon hat gesagt.:
			
		

> dann nicht


grml - dann eben nicht sich selbst gedanken machen und mal überlegen und was arbeiten .....


----------



## Limon (6. Apr 2006)

*Danke tini*, hast mir sehr geholfen!!!



> grml - dann eben nicht sich selbst gedanken machen und mal überlegen und was arbeiten .....



Sorry, aber bei der Aufgabe stand ich wirklich auf dem Schlauch


----------

