# Array gruppieren



## EddyKordo (21. Mai 2012)

Hii 

ich habe eine ArrayList und möchte diese nach dem Datum gruppieren da ich diese in kw umwandle und dann möchte ich nur die daten in eine neue arraylist schieben die dieselbe kw haben daten kommen aus eine excel tabelle via apache poi


----------



## Fab1 (21. Mai 2012)

Hast du selbst keine Idee wie du das anstellen könntest?


----------



## EddyKordo (21. Mai 2012)

Na ich hab mir vllt gedacht ich schaue wo die kw gleich ist und die speichere ich dann immer neu in eine liste ab

oder hast du ne andere idee ?


----------



## SlaterB (21. Mai 2012)

ohne Ideen ist fast automatisch Hausaufgaben-Bereich, verschoben,

gehe die Rohdaten erstmal durch, berechne zu jedem die kw und speichere alles in einer neuen Datenstruktur,
ein Array von Listen, kw = Index im Array etwa


----------



## ARadauer (21. Mai 2012)

Stichworkt HashMap. Key werden dann deine kw und Value eine liste mit deinen Elementen....


----------



## EddyKordo (21. Mai 2012)

Hab das jetzt mit der map gemacht nur wenn ich das ausgeben will sagt der mit das die arraylist leer ist 

gemeint ist z.B. excel.B_Tage.get(i);


```
public static LinkedHashMap<String, Inhalt> kw_selektieren(Inhalt excel) {
		int i = 0, j = 0;
		LinkedHashMap<String, Inhalt> map = new LinkedHashMap<>();
		Inhalt excel1 = new Inhalt();
		while (i < excel.KW.size()-1) {

			
			j = 0;

			while (excel.KW.get(i).equals(excel.KW.get(i + 1))) {

				excel1.B_Tage.set(j, excel.B_Tage.get(i));
				excel1.Bemerkung.set(j, excel.Bemerkung.get(i));
				excel1.Berechner.set(j, excel.Berechner.get(i));
				excel1.Stunden.set(j, excel.Stunden.get(i));
				excel1.ColA.set(j, excel.ColA.get(i));
				excel1.ColB.set(i, excel.ColB.get(i));
				excel1.ColC.set(j, excel.ColC.get(i));
				excel1.ColG.set(j, excel.ColG.get(i));
				excel1.ColH.set(j, excel.ColH.get(i));
				excel1.ColI.set(j, excel.ColI.get(i));
				excel1.Datum.set(j, excel.Datum.get(i));
				excel1.KW.set(j, excel.KW.get(i));
				excel1.Leistung.set(j, excel.Leistung.get(i));
				excel1.V_Tage.set(j, excel.V_Tage.get(i));
				excel1.Wochentag.set(j, excel.Wochentag.get(i));

				j++;

			}

			map.put(excel.KW.get(i), excel1);
		}

		return map;
```


----------



## ARadauer (21. Mai 2012)

du füst ja auch nix in die liste ein...


----------



## SlaterB (21. Mai 2012)

recht abenteuerlicher Code, 
wann soll die while-Schleife aus Zeile 12, falls sie einmal drankommt, je enden?
du machst zwar durchaus etwas in der Schleife, nämlich die anscheinend vielen einzelnen Listen alle mit denselben Werten zu planieren,
aber davon wird das equals ja nicht schlechter, wird bei true bleiben

dass du überhaupt je NACH der Methode drankommst läßt vermuten, dass diese innere Schleife nicht durchlaufen wird,
allerdings steht das put() für die Map gar nicht drin, schade, wäre gute Erklärung 

wo greifst du auf die Map zu? gib dort die size() aus, evtl. das KeySet, welche String-Keys sind vorhanden?

alle Keys in der Map verweisen übrigens auf ein und dasselbe Inhalt-Objekt
(edit: ok, das wird ja auch gefunden, dachte schon das Map-Result kommt nicht)

----

zu den vielen Einzellisten nochmal:
das ist ein klassisches Fehlkonstrukt, viel lieber nur eine Liste, welche Objekte enthält, darin dann Attribute wie datum, leistung usw.

Attribute auch klein schreiben!

ach, es wäre so viel zu korrigieren


----------



## EddyKordo (21. Mai 2012)

na ich wollte den inhalt einfügen der zu der jeweiligen kw gehört , 

wo ist da der fehler kannst du mir da genaueres sagen ?


----------



## SlaterB (21. Mai 2012)

siehe auch mein Posting,
noch zur Ergänzung was dir zuvor vorgeschlagen wurde:
kein equals-Vergleich,
nimm das KW von jedem i, such danach in der Map nach dem neuen Inhalt-Objekt oder lege eins an,
in dieses neue Inhalt-Objekt dann die Daten übernehmen, eher add() als set() auf die Einzellisten,
welche aber ja sowieso keine so tolle Idee sind


----------



## EddyKordo (21. Mai 2012)

hier greif ich auf die map zu 


```
LinkedHashMap<String,Inhalt> map = new LinkedHashMap<>();
					map = Excel_1.kw_selektieren(nexcel);
					
					Iterator iterator = map.values().iterator();
					
					while( iterator.hasNext())
					{
						Excel_1.export((Inhalt)iterator.next(),benutzer.getVname(),benutzer.getNname() );
					}
```

die while schleife ist nach dem return map geschlossen


----------



## ARadauer (21. Mai 2012)

im Grunde funktioniert eine Liste von Dingen in einer Map anahnd eines Keys speichern ungefähr so...


```
public void addElementToList(HashMap<String, List<String>> map, String key, String element){
        List<String> list = map.get(key);
        if(list == null){
            list = new ArrayList<String>();
            map.put(key, list);
        }
        list.add(element);
    }
```
versuchd das mal zu vestehen..


----------



## SlaterB (21. Mai 2012)

> hier greif ich auf die map zu

jaja, ok, der Punkt war schon geklärt, 
die Liste wird gefunden, ist nur eben leer

Rest siehe weitere Anteile in den Postings,

bzw. nochmal was anderes: stelle in deinen Worten dar, was eigentlich passieren soll,
arbeite nicht gleich die ganze Schleife ab, sondern nur ein Element, i=0,
was soll danach vorliegen? was genau müsste in der Map sein, und prüfe ob erfolgreich,

inwiefern wird dafür ein equals benötigt falls du das nicht schon ersatzlos wieder gestrichen hast?


----------



## EddyKordo (22. Mai 2012)

SlaterB hat gesagt.:


> zu den vielen Einzellisten nochmal:
> das ist ein klassisches Fehlkonstrukt, viel lieber nur eine Liste, welche Objekte enthält, darin dann Attribute wie datum, leistung usw.



sollen die Attribute dann als listen genommen werden oder als einfache arrays ? 


ist das so richtig wenn ich nur eine liste habe und ich adde dann nur die objekte ? 

list.add(Datum); zum beispiel ?


----------



## SlaterB (22. Mai 2012)

wenn du nur 10 Datums hast dann kommen die in eine Liste oder auch nicht,

(hier quasi reine Wiederholung des vorherigen, aber du zwingst mich ja dazu durch die simple Frage: )
wenn du aber 10x 5 Dinge hast, dann nicht in 5 Listen, sondern die 5 in ein Objekt als Attribut, String, int, Date, was auch immer,
und die 5 dann in eine Liste

stell dir vor du hast ein Kochbuch mit 10 Rezepte, jeweils mit Mengenangaben, Kochzeit, Kosten, Datum der Erfindung, Kalorien,

schreibst du nun ein Kochbuch mit 5 Seiten,
auf Seite 1 stehen untereinander die Mengenangaben aller Rezepte, auf Seite 2 die 10 Kochzeiten usw.,
- oder hast du 10 Seiten, auf jeder ein komplettes Rezept mit allen jeweils zugehörigen Informationen?

die Probleme kann man sich leicht denken, falsche Indexe, fehlendes Element welches alles verrutscht,
allein schon komplizierte Schreibweise usw.


----------

