# Durchlaufen von Sets



## maveee (20. Jun 2009)

Hallo , 

ich hab ne Klasse (subject) die eine ObjektVariable (x) enthält . nun hab ich auch ein Set von dieser Klasse (subject ) nämlich Set<subject> 

jetzt will ich alle Elemente von diesem Set vergleichen und den objekt(subject) mit dem kleinsten (x) zurückgeben.wie kann ich das machen ? 

meine idee war mit Iterator das Set zu durchlaufen ...aber ich weiß nicht genau wie 

danke


----------



## SlaterB (20. Jun 2009)

und es ist undenkbar, so eine grundlegende Info im Internet zu finden?
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 12 Datenstrukturen und Algorithmen
?
java set iterator beispiel - Google-Suche
?

bitte viele Beispiele lesen, dann fällt hoffentlich auch auf, dass man Klassen groß schreibt


----------



## maveee (20. Jun 2009)

erstmal danke ... aber es gibt keinen grund aggressiv zu sein ...

und mir gehts darum, auf die variable (x) zu zugreifen nicht auf ein element des Sets .... 

das heißt Iterator muß das Set durchlaufen und eine { get x } methode benutzen ....

das ist mein problem ! ....

danke nochmal !


----------



## SlaterB (20. Jun 2009)

agressiv = normal, daher kein Grund nötig 
(schaue auch gerade Dr. House, daran kann's liegen)

x liegt in den Objekten des Sets, daher musst du erstmal auf die Elemente des Sets zugreifen und dann auf die x darin


----------



## maveee (20. Jun 2009)

danke für die schnelle Antwort ... 

also bei mir siehts so aus : 


```
Subject getMinimalx (Set<Subject> N) 
    {
       
      Subject Gesucht ;
      Iterator it = N.iterator () ; 
      
      while (it.hasNext()){
          
          if ( Gesucht.getX() > it.next().getX() )    //Das hier kann ich nicht verstehen ...dieses (it.next() ist mir n bisschen komisch und ich kann damit nicht umgehen 
              {Gesucht = it.next() ; }
        }
           return     Gesucht ;         

            }
```


danke


----------



## SlaterB (21. Jun 2009)

it.next() liefert das nächste Element in der Liste, was könnte es einfacheres geben?

natürlich solltest du es nicht zweimal aufrufen, denn jeder Aufruf liefert ein anderes/ das nächste Objekt,
also nur einmal pro Schleifendurchlauf, und in einer Variablen speichern,
der getX() Aufruf klappt doch soweit oder?

Problem ist dann noch, dass Gesucht anfangs null ist, 
Gesucht.getX() führt zu einer NullPointerException,

vergleiche das mit dem echten Leben, um die größte von 5 Tomaten auszuwählen vergleichst du je zwei, aber was machst du am Anfang?


Variablen unbedingt klein schreiben!


----------



## maveee (21. Jun 2009)

ich bin mir nicht sicher aber ist das jetzt besser ? !!! obwohl dass ich n "Compiler Warning " bekomme ...."unsafe or unchecked operations " 


```
public Subject getMinimalx (Set<Subject> n) 
    {
       
      Subject gesucht = new Subject ("") ; 
      Iterator it = n.iterator () ; 
      
      while (it.hasNext()){

           Subject temp = it.next() ; 

          if ( gesucht.getX() > temp.getX() )   
              {gesucht = temp ; }
           }
           return gesucht ;         
 
        }
```


----------



## Illuvatar (21. Jun 2009)

```
Iterator<Subject> it = n.iterator();
```

Ansonsten stimmts so.


----------



## SchonWiederFred (21. Jun 2009)

Den Algorithmus, den Du da nachprogrammierst, gibt es bereits als Collections.min

```
public Subject getMinimalX(Collection<? extends Subject> subjekte)
{
	return Collections.min(subjekte, new Comparator<Subject>()
	{
		public int compare(Subject a, Subject b)
		{
			int x = a.getX();
			int y = b.getX();
			return (x < y) ? -1 : (x > y) ? +1 : 0;
		}
	});
}
```


----------



## maveee (21. Jun 2009)

Hallo  , 

danke SchonWiederFred  , ich bin Java Anfänger , und ich hab nur seit kurzem mit Collections und Sets zu tun , kannste mal n bisschen erklären was deine Idee da ist ? , die ersten 2 Zeilen vielleicht ? .... also der Methode wird ein Collection übergeben ?(bei mir muss der Methode ein Set übergeben werden ), und was ist dieses "Retrun" in der zweiten Zeile ...?

Danke


----------



## mvitz (21. Jun 2009)

maveee hat gesagt.:


> ...kannste mal n bisschen erklären was deine Idee da ist ?


Ich versuche es einfach mal 


maveee hat gesagt.:


> .... also der Methode wird ein Collection übergeben ?(bei mir muss der Methode ein Set übergeben werden )



Das Set Interface erbt von Collection, siehe auch Set (Java Platform SE 6) dementsprechend hast du damit kein Problem.



maveee hat gesagt.:


> ..., und was ist dieses "Retrun" in der zweiten Zeile ...?...



Damit returned man das Ergebnis der Methode Collections (Java Platform SE 6)). Dieser übergibt man die Collection, aus der man das Minimum ermitteln möchte und einen Comparator. Dieser Comparator, weiß, wie man zwei Objekte vergleicht.
Was jetzt hier noch gemacht wird, ist das er mit

```
new Comparator<Subject>() {...}
```
direkt dort wo er die Klasse braucht sie Implementiert.
Man könnte auch selber eine Klasse schreiben.

```
public class SubjectComparator implements Comparator<Subject> {...}
```
Dieses interface erwartet, dass man die Methode:

```
public int compare(T a, T b);
```
überschreibt. Dein T ist in diesem Falle halt Subject. Die Methode vergleicht also zwei Object miteinander. Wenn das erste kleiner ist muss der Rückgabewert < 0 sein, ist das erste größer muss der Rückgabewert > 0 sein, sind beide gleich muss 0 zurückgegeben werden. Genau dies wird auch gemacht, nur dass er dies in eine Zeile gepackt hat mit einem erweiterten If-Konstrukt.
Jetzt wo der Comparator weiß, wie er zwei Subject vergleicht, macht er dies für alle Werte, merkt sich das Minimum und gibt dir am Schluss dieses zurück.

Insofern erspart dir diese Methode dich um das vergleichen aller Subject zu kümmern und auch das speichern des Minimums entfällt. Du musst halt nur implementieren, wie man zwei Subject miteinander vergleichen kann.

Hoffe du hast jetzt mehr verstanden.


----------



## maveee (21. Jun 2009)

danke an euch alle .... ich probier jetzt n bisschen mal rum so dass ich alles 100% nachvollziehen kann .


----------

