ArrayList Gruppieren, "Doppelte Werte" Addieren

Steffanie

Mitglied
Hallo Liebe Community,

Ich hab folgendes Problem, nämlich gibt der User über eine Gui folgendes ein/wird ausgefüllt.
RpPU2sk.png

So nun sollen diese Werte in eine Tabelle geschrieben werden. Und da fängt die Katastrophe an...
Das die Werte in die Tabelle übernommen werden klappt. Nur leider finde ich keine Möglichkeit
Diese zusammenzufassen...
Java:
String inhalt =    	jTextArea1.getText().toString();
	List<String> myList = new ArrayList<String>(Arrays.asList(inhalt.split("\n")));
Hier erhalte ich
Java:
[120 Bananen, 130 Kirschen, 10 Bananen, 20 Kirschen]

Also dachte ich mir nochmal bei " " teilen, bzw davor ", " mit "," ersetzen bzw noch der Reihenfolge nach Sortiert.
Das passiert dann darüber...
Java:
private void putTextInList(){
    	String inhalt =    	jTextArea1.getText().toString();
    	List<String> myList = new ArrayList<String>(Arrays.asList(inhalt.split("\n")));
    	//Set<String> s = new HashSet<String>(myList);
    	myList = new ArrayList<String>(new HashSet<String>(myList));   	
    	inhalt = new StringBuilder(myList.toString()).reverse().toString();
    	inhalt = inhalt.toString().replace("[","");
    	inhalt = inhalt.toString().replace("]","");
    	inhalt = inhalt.toString().replace(",",",");
    	inhalt = inhalt.toString().replace(" ,",", ");
    	myList = new ArrayList<String>(Arrays.asList(inhalt.split(", ")));
    	Collections.sort(myList);    	
    	inhalt = new StringBuilder(myList.toString()).reverse().toString();
    	inhalt = inhalt.toString().replace(" ,",", ");
    	ArrayList<String> myMaterialList = new ArrayList<String>(Arrays.asList(inhalt.split(" ")));
    	inhalt =  myMaterialList.toString().replace(",,",",");
    	
    	inhalt = inhalt.toString().replace("[","");
    	inhalt = inhalt.toString().replace("]","");
    	myMaterialList = new ArrayList<String>(Arrays.asList(inhalt.split(", ")));
    	//int x = myMaterialList.size()/2;
    	System.out.println(myMaterialList.toString());

    	
    	
    }

Java:
//Ausgabe 
[120, Bananen, 10, Bananen, 130, Kirschen, 20, Kirschen]
also dachte ich mir jetzt mit einer Forschleife das ganze Gruppieren... Aber das klappt irgendwie nicht...
Java:
String namenszwischenspeicher = "";
    	int zwischenspeicher = 0;
    	for (int i = 0; i < myMaterialList.size(); i=i+2) {
    		
    		if(namenszwischenspeicher.equals(myMaterialList.get(i+1))){
    			zwischenspeicher += Integer.parseInt(myMaterialList.get(i));
    		} else {
    			t.addRow(new Object[]{namenszwischenspeicher,zwischenspeicher});
    		}   		
    		
    		namenszwischenspeicher = myMaterialList.get(i+1);
    		zwischenspeicher = Integer.parseInt(myMaterialList.get(i));
    	}

///.. Methode addrow.
    public void addRow(Object[] o){
    	DefaultTableModel modelTemp = (DefaultTableModel) jTable1.getModel();
    	modelTemp.addRow(o);
    }

Die Tabelle sind dann so aus...
aOZdkXK.png
 

Anhänge

  • aOZdkXK.png
    aOZdkXK.png
    18,7 KB · Aufrufe: 31
du machst das unglaublich kompliziert.
Nutze lieber soetwas wie eine hashmap, welche jeweils die Frucht auf ihre Anzahl abbildet.

Gehe z.b. zeile für zeile durch und hole dir jeweils die Anzahl und die Frucht.
z.B. sehr simpel:
Java:
String[] parts = line.split(" ");
int anzahl = Integer.parseInt(parts[0]);
String name = parts[1];

Dann schaust du nach ob bereits die entsprechende Frucht in der map existiert und addierst ggf. den Wert darauf:
Java:
if(map.containsKey(name)) {
  anzahl += map.get(name);
}
map.put(name, anzahl);
 
Vielen Dank erstmal. Versuche das mal umzusetzen, Mein Kopf raucht leider schon etwas kann also dauern, bis ich mich wieder melde... aber vielen vielen Dank für die schnelle Antwort 😳

Danke <3

mit
Java:
private void putTextInList(){
    	String line =    	jTextArea1.getText().toString();
    	HashMap<String, Integer> map = new HashMap<String, Integer>();
    	line = line.replace("\n"," ");
    	String[] parts = line.split(" ");
    	for (String string : parts) {
			System.out.println(string);
		}
    	int anzahl = 0;
    	String name = null;
    	for(int i =0;i<parts.length;i = i+2){
    	anzahl = Integer.parseInt(parts[i]);   	
    	name = parts[i+1];
    	
    	if(map.containsKey(name)) {
    		  anzahl += map.get(name);
    		}
    		map.put(name, anzahl);
    	
    }
Funktioniert es 🙂
Eingabe:
150 Bananen
30 Kirschen
20 Bananen
10 Kirschen
Ausgabe
{Kirschen=40, Bananen=170}
Vielen Vielen Vielen Dank 🙂
 
Zuletzt bearbeitet:
Hallo,
ich hätte an deiner Stelle eine kleine Klasse geschrieben welche die Attribute Name und Anzahl hat und noch die Methode isGleichesProdukt was die Namen vergleicht und nen Boolean zurück gibt. Danach beim " " splitten, in eine liste, dann noch eine liste wo du die gesammt anzahl drin hast, zun schluss einfach mit einer Verschachtelten Schleife drüber und fertig.

Solltemit Pseudocode so aussehen:

List produkte = new List();

Für alle line in lines
String[] parts = line.split (" ");
Produkt p = new Produkt ( parts [0] , parts [1]);
boolean vorhanden = false;
Für alle produkt in produkte (solange nicht vorhanden)
if produkt.IsGleichesProdukt (p){
produkt.anzahl += p.anzahl;
vorhanden = true;

}
Ende
if not vorhanden
produkte.add(p);
Ende
Ende


P.S. Ist nur Pseudocode, also die Java Conventionen hab ich nicht beachtet!

Gruß,
AntiMuffin
 
@Steffanie: Gern geschehen^^

@AntiMuffin: Name+Anzahl in eine eigene Klasse zu stecken ist selbstverständlich in Ordnung, allerdings ist es halt extrem ineffiezient immer die ganze liste durchzugehen, nur um zu prüfen ob bereits so ein Objekt existiert.
Die Prüfung ob ein Objekt schon existiert kostet dich direkt lineare Laufzeit O(n), während die Prüfung mit der Hashmap in O(1) möglich ist.
 
@InfectedBytes: Stimmt da hast du recht, darauf hab ich jetzt gar nicht geachtet. Dann ist eine Lösung natürlichen besser (um N mal so gut ^_^).
 
Zuletzt bearbeitet:

Zurück
Oben