# Collections - subList erstellen



## Dennis9 (3. Apr 2010)

Hallo, habe gerade ein Brett vor dem Kopf, es geht um die Fuktion _subList(int fromIndex, int toIndex)_. Also ich will zu der ArrayList list2, noch eine Teilliste dranhängen. 

Meine Überlegung: Man soll ja bei der subList-Funktion den ersten Übergabeparameter (fromIndex) _einschließlich der Teilliste_ nehmen, und (toIndex)_ ausschließlich_ soweit ich das richtig verstanden habe. 

Die ArrayList list2 gibt mir 15 Elemente aus, also muss der letzte Index = 14 sein, daher nehme ich für das Teilarray fromIndex = 15. Ich will 7 Werte in das Teilarray schreiben, also nehme ich toIndex = 22 (ausschließlich). Trotzdem wirft er mir ne Exception .. kann mir jmd helfen ? 
hoffe das ist jetzt nich zu unübersichtlich 


```
import java.util.*;

public class ListTest
{
	//Elemente in Liste einfügen
	static void fillList(List list)
  	{
		//Zahlen von 0 bis 19 als Zeichenketten (Strings) einfügen
    	for (int i = 0; i < 20; ++i) 
		{
      		list.add("" + i);
    	}
		//Element an der Position 3 entfernen
    	list.remove(3);
		//Erstes Element in der Liste entfernen, das gleich "6" ist
    	list.remove("6");
  	}

	//Liste vom Anfang bis zum Ende durchlaufen und Elemente ausgeben
  	static void printList(List list)
  	{
		ListIterator it = list.listIterator();
		while (it.hasNext()) 
		{
      		System.out.print((String)it.next()+" ");
    	}
    	System.out.println("\n-");
  	}
  	
  		// Aufgabe 42 
  		static void printInverseList(List list)
  		{
  			int lastindex = list.size(); // !!
  			ListIterator inv = list.listIterator(lastindex);
  			while(inv.hasPrevious())
  			{
  				System.out.print(inv.previous()+" ");
  			}
  			System.out.println("\n-");
  		}
  		
  		// Aufgabe 43
  		static void remove5List(List list)
  		{
  			String temp;
  			ListIterator it = list.listIterator();
  			while(it.hasNext())
  			{	
  				temp = (String) it.next();
  				if (temp.startsWith("0"))
  					continue;
 
  				if ( temp.endsWith("0") || temp.endsWith("5") )
  					it.remove();
  			}	
  		}
  		
  		// zu Aufgabe 44
  		static void fillSubList(List list)
  		{
  			for (int i = 7; i < 14; ++i)
  			{
  				list.add("" + i);
  			}
  		}
  	
  	

  	public static void main(String[] args)
  	{
    	//Erzeugen der LinkedList
    	LinkedList list1 = new LinkedList();
    	fillList(list1);
    	printList(list1);
    	printInverseList(list1);
    	
    
		//Erzeugen der ArrayList
    	ArrayList list2 = new ArrayList();
    	fillList(list2);
    	remove5List(list2);
    	printList(list2);
    	printInverseList(list2);
    	System.out.println("\n\n list2-Groesse:"+list2.size());
    	
    	// Aufgabe 44
    	list2.subList(15, 22);  // <<-------------------------------
    	fillSubList(list2);
    	printList(list2);
  	}
}
```


Ausgabe:

```
0 1 2 4 5 7 8 9 10 11 12 13 14 15 16 17 18 19 
-
19 18 17 16 15 14 13 12 11 10 9 8 7 5 4 2 1 0 
-
0 1 2 4 7 8 9 11 12 13 14 16 17 18 19 
-
19 18 17 16 14 13 12 11 9 8 7 4 2 1 0 
-


 list2-Groesse:15
Exception in thread "main" java.lang.IndexOutOfBoundsException: toIndex = 22
	at java.util.SubList.<init>(Unknown Source)
	at java.util.RandomAccessSubList.<init>(Unknown Source)
	at java.util.AbstractList.subList(Unknown Source)
	at ListTest.main(ListTest.java:87)
```


----------



## eRaaaa (3. Apr 2010)

Ich glaube du verstehst die Methode subList falsch. Die hängt nichts dran, sondern sie liefert eine neue Liste mit den Werte aus dem Bereich [from....to) aus der Liste auf der du die Methode anwendest 

List (Java Platform SE 6)

Und du willst jetzt eig. _was_ machen?


----------



## Dennis9 (3. Apr 2010)

achoooo okay dann hab ich das wohl falsch verstanden .. 

also ich will eine Teilliste der Liste list2 erzeugen, die mit dem Element "7" anfängt und dem Element "13" endet .. 

das wäre doch dann so oder:


```
list2.subList(7,14);
```


----------



## eRaaaa (3. Apr 2010)

Also,

a) du musst natürlich aufpassen..bei subList gehts um den Index, nicht ums Element ! Was ich meine ist, dass du ja z.B. bei deiner ersten Liste die Strings "0"-"19" in die Liste steckst, dann den String am Index 3 ,also den String "3" löschst und anschließend auch noch den String "6" löschst. Dadurch verschieben sich natürlich deine Strings "7" und "13" so dass du bei subList(7,14) dann die Strings "9" - "15" erhalten würdest.

b) nur subList(...) aufzurufen bringt natürlich nichts. Du müßtest das schon irgendwie zuweisen oder irgend etwas damit machen.

```
List sublist = list1.subList(7, 14); //besser wäre sicherlich auch generische Listen!
```

c) Desweiteren muss man auch aufpassen beim Löschen etc., denn die subListe hängt eng mit der anderne Listen zusammen, das steht aber auhc oben im Link

..so genau weiß ich aber immer noch nicht was genau du dann eig. machen willst mit der subList ;/


----------



## Dennis9 (3. Apr 2010)

achja genau die elemente sind ja die Werte die über die Indizes angesprochen werden .. 

wollte die subList ausgeben .. _*List sublist = ............*_ diese Zuweisung hat mir noch gefehlt also wie man die Teilliste abspeichert um sie nacher auszugeben ..  naja arbeite das erste mal mit listen .. 

aber hat nun alles geklappt thx !


```
List sublist = list2.subList(4, 10);
    	printList(sublist);
```


----------

