# ArrayListen und Generics



## kurtisblow (24. Apr 2012)

Hallo,
ich habe ein Interface zur Verfügung und soll es nun implementieren.
Dies habe ich bisher folgendermassen getan:



```
package u7a1;

import java.util.ArrayList;

public class IFilterImplement implements IFilter {
	public final int maxNumberofPoints = 80;
	public final double criteria = 50;
	
	// testatpoints: criteria/100*maxNumberofPoints
	/**
	 * Filter all students that achieved enough points for the "Testat".
	 * 
	 * @param groups a ArrayList of groups, where a group is a ArrayList of students
	 * @return the ArrayList of all students who achieved enough points for the "Testat".
	 */
	public ArrayList filterRaw(ArrayList groups)
	{
		ArrayList list = new ArrayList();
		list.add();
		return list;
	}

	/**
	 * Filter all students that achieved enough points for the "Testat".
	 * 
	 * @param groups a ArrayList of groups, where a group is a ArrayList of students
	 * @return the ArrayList of all students who achieved enough points for the "Testat".
	 */
	public ArrayList<Student> filterGeneric(ArrayList<ArrayList<Student>> groups)
	{
		ArrayList<ArrayList<Student>> list = new ArrayList<ArrayList<Student>>();
		list.add(new ArrayList<ArrayList<Student>>(1));
		return list;
	}
}
```

Meine Frage:
Bei filterRaw bekomme ich ja eine ArrayList übergeben.
Jetzt wollte ich der neuen ArrayList list aus jeder Gruppe die Studenten hinzufügen,
die genug Testatpunkte haben, also mindestens 50.
Jetzt möchte ich das ganze in einer For-Schleife machen um bei jedem Student zu überprüfen
ob er nach der obigen Formel genug Testatpunkte hat und dann der list hinzufügen.
Wie genau muss diese For Schleife aussehen, ich weiss ja nicht wie gross groups ist?
Habe bisher folgendes:

```
public ArrayList filterRaw(ArrayList groups)
	{
		ArrayList list = new ArrayList();
		for (int i = 0; i<groups.size();i++)
		{
			for (int j = 0; j < groups. )
			list.add(new ArrayList(i));
		}
		return list;
	}
```


----------



## SlaterB (24. Apr 2012)

dann ist es ja erledigt, groups.size() löst es?

für die innere Schleife musst du wohl groups.get(i) herausholen und dessen size() berücksichtigen


----------



## kurtisblow (24. Apr 2012)

Naja,
wie genau kann ich aber einen Student aus einer Gruppe des groups array nehemen?
Dann könnte ich es schon lösen.
Ich gehe ja jede Gruppe durch und füge der Liste alle Studenten zu, für die gilt:
criteria < 50


----------



## SlaterB (24. Apr 2012)

mit get() erhält man die Objekte aus der Liste

schon bekannte Info? dann hättest du besser gleich noch deutlicher geschrieben,
haderst du im Moment mit der 2D-Verschachtelung oder den Cast auf die richtige Klasse oder oder?


----------



## kurtisblow (24. Apr 2012)

Also wenn ich jetzt
3 Studenten in der ersten Gruppe und 2 in der zweiten Gruppe habe.
mit welchem Befehl greife ich auf den ersten Studenten der zweiten Gruppe zu?
mit groups.get(2) greife ich doch auf die zweite Gruppe zu?
Greiffe ich dann mit (groups.get(2)).get(1) auf den ersten studenten der zweiten Gruppe zu?


----------



## SlaterB (24. Apr 2012)

abgesehen davon dass die Indexe bei 0 zu zählen beginnen 
kannst du das doch ausprobieren und erst bei konkreten Problemen hier fragen?
und dann auch schon mit Fehlermeldungen oder sonstigen Informationen 'es scheint eher das dritte Element zu sein?' glänzen


----------



## rokko123 (24. Apr 2012)

Mh habe grad die selbe Aufgabe und ich glaube du hast da das vorgegeben Interface verändert...

Hättest lediglich bei eclipse rechtsklick machen brauchen >> new >> class >> name: Filter >> add >> IFilter, dann erstellt dir eclipse deine klasse schön sauber und da kannst du dann die beiden Methoden filterRaw und filterGeneric reintipseln.


```
package u7a1;

import java.util.ArrayList;

public class Filter implements IFilter {

	@Override
	public ArrayList filterRaw(ArrayList groups) {}

     @Override
	public ArrayList<Student> filterGeneric(ArrayList<ArrayList<Student>> groups) {}
```

Nur als Hinweis, kriegste sonst wahrscheinlich Punktabzug...

und halt je 2 for-Schleifen, bei der zweiten criteria prüfen und dann hast dus auch schon


----------



## kurtisblow (24. Apr 2012)

Ok, danke

komme aber leider mit den for-Schleifen nicht klar.
habe bis jetzt folgendes:


```
public class Filter implements IFilter {

	public final int maxNumberofPoints = 80;
	public final double criteria = 50;
	@Override
	public ArrayList filterRaw(ArrayList groups) 
	{
		ArrayList list = new ArrayList();
		for (int i = 0; i<(int)groups.size();i++)
		{
			for (int j = 0; j<groups.get(i);j++)
			{
				if((int)groups.get(j)>50)
				{
					list.add(new ArrayList(j));
				}
			}
		}
		return list;
	}

	@Override
	public ArrayList<Student> filterGeneric(ArrayList<ArrayList<Student>> groups) 
	{
		ArrayList<ArrayList<Student>> list = new ArrayList<ArrayList<Student>>();
		for (int i = 0; i<groups.size();i++)
		{
			for (int j = 0; j<groups.get(i);j++)
			{
				if(groups.get(j)>50)
				{
					list.add(new ArrayList<ArrayList<Student>>(j));
				}
			}
			for (ArrayList<ArrayList<Student>> t : groups)
				t.cancel();
		}
		return list;
	}

}
```


----------



## rokko123 (24. Apr 2012)

mach dir mal ne hilfsfunktion die das Testatkriterium prüft:


```
if (criteria(student)) {
list.add(student);
}



public boolean criteria(Student student) {
		   .....
		}
```


----------



## kurtisblow (25. Apr 2012)

Ok, danke,das mit den Testatpunkten habe ich hinbekommen,


```
public boolean criteria (Student student)
	{
		double points = (((double)student.getPoints())/maxNumberofPoints)*100;
		if (points > criteria)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
```

wie kann ich aber auf die einzelnen studenten einer Gruppe der Gruppen zugreiffen? Dies ist mir
immer noch ein Rätsel.


----------



## kurtisblow (25. Apr 2012)

```
public class Filter implements IFilter {

	public final int maxNumberofPoints = 80;
	public final double criteria = 50;
	
	public boolean criteria (Student student)
	{
		double points = (((double)student.getPoints())/maxNumberofPoints)*100;
		if (points > criteria)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	
	public ArrayList filterRaw(ArrayList groups) 
	{
		
		ArrayList list = new ArrayList();
		for (int i = 0; i<groups.size();i++)
		{
			for (int j = 0;  (groups.get(i)).size > j;j++)
			{
				Student student = (Student) groups.get(i);
				if(criteria(student))
				{
					list.add(student);
				}
			}
		}
		return list;
	}


	
	public ArrayList<Student> filterGeneric(ArrayList<ArrayList<Student>> groups) 
	{
		ArrayList<ArrayList<Student>> list = new ArrayList<ArrayList<Student>>();
		for (int i = 0; i<groups.size();i++)
		{
			for (int j = 0; (groups.get(i)).size() > j;j++)
			{
				ArrayList<Student> student = groups.get(i);
				if(criteria(student))
				{
					list.add(student);
				}
			}
		}
		return list;
	}

}
```

Habe jetzt mal das hier, funktioniert noch nicht, leider


----------



## rokko123 (25. Apr 2012)

deine Testatbedinung is nicht ganz richtig.. 


```
return student.getPoints() >= (criteria/100*maxNumberOfPoints)
```
wärs eigentlich, damit kannst du dir dann auch das if-else-zeuchs sparen in dieser Methode


in der ersten for-schleife fehlt noch je sowas 
	
	
	
	





```
ArrayList xy = (ArrayList) groups.get(i);
```


bei 
	
	
	
	





```
(groups.get(i)).size()
```
 kannst auch einfach 
	
	
	
	





```
for (j = 0; j < groups.size(); j++) {
```
 schreiben, weiss ned ob das andere funktioniert, sieht aber bisschen komisch aus, habs nit getestet

gl


----------



## kurtisblow (25. Apr 2012)

Ok danke


----------



## Landei (25. Apr 2012)

Wie wäre es mit Generics für die ArrayList?


----------

