# Daten in Liste speichern



## moessi91 (11. Nov 2010)

Ich möchte gerne eine unbekannte Menge von Daten(2 Strings), in eine Liste speichern. 
Diese sollen da nach dem Wert des ersten Strings Sortiert werden. Die daten werden aus einer Datenbank ausgelesen. Die Frage die sich mir stellt ist welche Liste ich verwenden soll, wie genau ich die Daten rein und rauß bekomme und wie ich sie da drinnen sortiere oder dass sie gleich sortiert eingelesen werden.

danke schon mal im voraus.


----------



## Network (11. Nov 2010)

Was für eine Liste du verwendest, hängt davon ab wie genau du sie verwenden willst.

Ein Wert mitten aus der Liste rausgreifen, mehrmals: Hashmap
Die Werte nacheinander auslesen: ArrayList

Du kannst auch Anfangs eine ArrayList verwenden, und sollte diese zu langsam sein, diese durch eine Hashmap austauschen. Das ist garkein Problem.

In einer ArrayList kannst du die Werte mit "sort" sortieren.
Auslesen funktioniert zweierlei.
Entweder du suchst nach einem Wert, und bekommst als Ergebniss die Indexnummer in der Liste zurück.
Oder du suchst nach einer Position in der Liste, und bekommst den Wert an dieser Stelle zurück.

Das funktioniert mit:

```
getIndexOf( [String] )
// und:
get( [Nummer] )
```

Einfügen der Daten ist genauso leicht:
mit

```
liste.add( [Wert] )
```
fügst du einen Wert ans Ende der Liste hinzu.

Mit

```
liste.add( [Zahl], [Wert] )
```
fügst du einen Wert an eine bestimmte Stelle hinzu.


Alles weitere findest du, wenn du nach ArrayList googelst, und gleich das erste von Oracle nimmst.


----------



## Marcinek (11. Nov 2010)

Du machst dir eine Klasse "MeineDaten" mit zwei Attributen string1 und string2,

dann implementiet diese Klasse noch Comparable<String>

und bei compareTO musst du quasi das compare von String 1 aufrufen.


----------



## dehlen (11. Nov 2010)

*Pseudocode*

so musst du die textdatei mit deinen Strings lesen


```
import java.io.*;

class LiesEineDatei {
public static void main (String[] args) {
try {
File MeineDatei = new File ("MeinText.txt"); //Ein Filereader ist ein Anschlußstrom für Zeichen der sich mit einer Textdatei verbindet//
FileReader fileReader = newFileReader (meineDatei);

BufferedReader reader = new BufferedReader (fileReader); //Verkette den FileReader mit einem BufferedReader damit du effizienter lesen kannst. Er kehrt erst dann wieder zum Lesen zur Datei zurück wenn der Puffer leer ist//
String zeile = null; // Erzeuge eine String Variable die jeweils die Zeile aufnimmt während sie gelesen wird//

while ((zeile = reader.readLine()) !=null) { // Heißt: "Lies eine Textzeile und weise sie der String Variable namens Zeile zu.Solange die Variable nicht null ist gib die Zeile aus die gerade gelesen wurde"//
System.out.println(zeile);
}
reader.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
```


----------



## Michael... (11. Nov 2010)

moessi91 hat gesagt.:


> Die daten werden aus einer Datenbank ausgelesen.


Lies die Daten sortiert von der Datenbank aus. Die können meist effektiver sortieren als ein Javaprogramm.
Zum speichern siehe Post von Marcinek


----------



## moessi91 (11. Nov 2010)

Ja ich weiß ja nicht mal was für eine Liste ich genau verwenden sollte. 
Hab mir schon hashmap oder arraylist ein bisschen angeschaut sieht aber alles ziemlich kompliziert aus. 
Es werden eben eine Unbekannte menge an Strings aus der DB ausgelesen und dann sortiert in eine Combobox gefüllt. 
So ist es genau gemeint. 
@Network: hab die sort funktion bei einer array list irgendwie ned gefunden.


----------



## hdi (11. Nov 2010)

```
public class MyData implements Comparable<MyData> {

	private String s1, s2;

	public MyData(String s1, String s2) {
		this.s1 = s1;
		this.s2 = s2;
	}

	@Override
	public int compareTo(MyData other) {
		return other.s1.compareTo(this.s1);
	}
}
```



```
public class MyDatabase{
 
    private List<MyData> myData = new ArrayList<MyData>();

    public void fill(){
        /* Verbindung zu deiner Datenbank erstellen, per Schleife alle Daten auslesen, MyData Objekte   erzeugen (entweder per DAO oder manuell), und sie der Liste per add(...) hinzufügen 
        */
    }
}
```


```
// an geeingeter Stelle:
ComboBox box = new ComboBox(myData.toArray());
```

Wie schon einer meiner Vorredner sagte operieren diese ganzen Sorters immer mit der compareTo-Methode, und die ist in der MyData Klasse eben so implementiert, dass sie den ersten String vergleicht (für Strings ist die compareTo-Methode schon in geeigneter Weise implementiert, deswegen kannst du das einfach dahin weiterleiten)

Und was die ArrayList angeht: Auch wenn sie dir vllt kompliziert erscheint, so ist es doch die einfachste Variante  Auf jeden Fall wär das hier die Datenstruktur der Wahl! HashMap wäre Unsinn, da eine Map keine Liste ist sondern eben eine Map, d.h.sie speichert nicht einfach nur n Einträge, sondern n Tupel mit Zuordnung, sowas hast du ja gar nicht.


----------



## Network (11. Nov 2010)

moessi91 hat gesagt.:


> Ja ich weiß ja nicht mal was für eine Liste ich genau verwenden sollte.
> Hab mir schon hashmap oder arraylist ein bisschen angeschaut sieht aber alles ziemlich kompliziert aus.
> Es werden eben eine Unbekannte menge an Strings aus der DB ausgelesen und dann sortiert in eine Combobox gefüllt.
> So ist es genau gemeint.
> @Network: hab die sort funktion bei einer array list irgendwie ned gefunden.



ArrayLists sind seeeehr einfach zu implementieren:

ArrayLists können alles beinhalten was du willst. Jedoch nur vom selben Datentyp.
Also eine ArrayList, die einen Integer beinhaltet, kann nicht gleichzeitig einen String beinhalten.

```
//Erster schritt: ArrayList definieren
ArrayList<[Typ]> [Name] = new ArrayList<[Typ]>;
//[Typ] = Typ der Werte die eingetragen werden sollen
// In deinem Fall steht da dann einfach nur "String" drin
//[Name] = Name der Liste
```


```
//Die ArrayList ist nun fertig, jetzt können wir Daten hinzufügen:
[Name].add( [wert] );
//[wert] = Was du eintragen möchtest.
```


```
//Nachdem wir nun nach der oberen Variante einen oder mehrere Werte eingetragen haben
//ziehen wir ein paar Werte wieder heraus:
[Name].get( [Nummer] );
//[Nummer] steht in diesem Fall, für die Postition des Wertes in der Liste, 
//den du zurück haben möchtest
//
//[Nummer] kann man im Grunde mit dem Namen eines Strings vergleichen,
//bloss dass die Namen, Nummern sind, und von 0 bis Listenende reichen.
```


----------



## hdi (11. Nov 2010)

> ArrayLists können alles beinhalten was du willst. Jedoch nur vom selben Datentyp.


@TO: Dem User Network ist das wohl klar, aber nur damit es nicht zu Missverständnissen bei dir kommt: Wenn hier vom "selben" Datentyp gesprochen wird, dann ist damit gemeint die Datentypen der Objekte in der Liste müssen dem Begriff der Polymorphie nach die "selben" sein, was nicht heißt, dass sie _identisch _sein müssen, sondern nur innerhalb der selben Vererbungshierarchie liegen müssen.



> Also eine ArrayList, die einen Integer beinhaltet, kann nicht gleichzeitig einen String beinhalten.


Eben weil diese Klassen nicht in einer Vererbungshierarchie stecken. Aber was durchaus geht:


```
List<Object> list = new ArrayList<Object>();
list.add(new Integer(5));
list.add(new String("..."));
```

Denn Integer und String (sowie auch jede andere Klasse) erben von Object.

<Klugshice-Mode OFF>


----------



## moessi91 (11. Nov 2010)

Habe das ganze folgendermaßen gelöst jedoch überschreibt es mir immer die vorher eingegebenen Daten.


```
ResultSet rs = sqlAnw.executeQuery("SELECT vorname, nachname, idkuenstler FROM artists ORDER BY vorname ASC");
		
		ArrayList <String[]> array = new ArrayList <String[]> ();

		
		while(rs.next())
		{
			sDaten[0] = rs.getString("idkuenstler");
			System.out.println("ID-Künstler: "+sDaten[0]);
			sDaten[1] = rs.getString("vorname");
			System.out.println("Vorname: "+sDaten[1]);
			sDaten[2] = rs.getString("nachname");
			System.out.println("Nachname: "+sDaten[2]);
			
			array.add(sDaten);
		}
		
		for(int i = 0; i<array.size();i++)
		{
			System.out.println("ID: "+array.get(i)[0]);
			System.out.println("ID: "+array.get(i)[1]);
			System.out.println("ID: "+array.get(i)[2]);
		}
```

Ausgabe: 
ID-Künstler: 3641frates
Vorname: franz
Nachname: test
ID-Künstler: 2383testes
Vorname: test
Nachname: test
ID: 2383testes
ID: test
ID: test
ID: 2383testes
ID: test
ID: test


----------



## Michael... (11. Nov 2010)

Das String Array muss innerhalb der while Schleife erzeugt werden.
[JAVA=6]while(rs.next())
		{
			sDaten[] = new String[3];
			sDaten[0] = rs.getString("idkuenstler");[/code]


----------



## Marcinek (11. Nov 2010)

Weil du dafür das Array in der While-Schleife immer neu erstellen musst


----------



## moessi91 (11. Nov 2010)

vielen Dank für die Hilfe jetzt geht alles


----------

