2016-04-06 14 views
0

Ich habe eine Array-Liste mit Objekten gefüllt, die jeweils Informationen über sie haben. Beispiel: etwas wie dieseJava - Alphabetisch sortieren und einzigartige Elemente zusammenstellen

{Term(C,2), Term(H,2), Term(C,1), Term(O,3)} 

Das jetzt Ziel ist es, die Arraylist zu ändern, so ist das Ergebnis:

{Term(C,3), Term(H,2), Term(O,3)} 

Wir wollen gemeinsam die ähnlichen Begriffe sammeln. Ich habe folgendes in dieser Phase.

char element = 'A'; 
int amt_atom = 0; 
int index = 0; 

char alphabet = 'A'; 
char alpha = 'A'; 

for (; alpha <= 'Z' ; alpha++){ 
    search: 
    for (; alphabet <= 'Z' ; alphabet++) { 
     for (int i = 0 ; i < terms.size() ; i++){ 
      if (terms.get(i).getElement() == alphabet){ 
       element = terms.get(i).getElement(); 
       amt_atom = terms.get(i).getAtoms(); 
       index = i; 


       System.out.println(element + " , " + amt_atom + " , " + index); 
       alphabet++; 
       break search; 
      } 
     } 
    } 

    for (int i = 0 ; i < terms.size() ; i++){ 
     if (terms.get(i).getElement() == element && i != index){ 
      int amt_atoms2 = terms.get(i).getAtoms(); 
      terms.set(index, new Term (element, amt_atom + amt_atoms2)); 
      terms.remove(i); 
     } 
    } 
} 

Auch das Array gegeben möglicherweise nicht alphabetisch und wir müssen es auch in alphabetischer Reihenfolge. Ein anderes Beispiel wäre: CH3CH2CH2CH2CH2CH3 und das Ergebnis = C6H14.

Bearbeiten: Sorry, sollte angegeben haben, was mit dem ursprünglichen Code falsch war. Also, Doing C2H2HO3 Ergebnisse in C2H3O3 was fantastisch ist, weil es richtig ist, aber wenn ich versuche CH3CH2CH2CH2CH2CH3 dann bekomme ich C2H5, die überhaupt nicht korrekt ist. Ich bin mir nicht sicher, warum das so ist.

Bin ich überhaupt auf dem richtigen Weg? Könnte mir vielleicht jemand sagen, was ich falsch mache? Ich bin relativ neu in Java und habe daher ein extrem grundlegendes Wissen, also wäre es gut, wenn Sie etwas erklären könnten, während Sie Strukturen und Elemente von Java verwenden, die ich oben verwendet haben könnte. Danke

+1

Was w/der Code falsch ist zur Zeit haben Sie? –

+0

@ScottHunter Guter Punkt. Entschuldigung, Sollte angegeben haben. Bearbeitet :) – Azazel

Antwort

3

Wie wäre es zuerst sortieren, dann sortieren? Sie könnten Ihre Term implementieren die Comparable Schnittstelle und dann einfach terms.sort(); aufrufen. Dann gehen Sie über die Liste und sortieren Sie, was einfacher ist, sobald es sortiert ist.

Mach dir keine Sorgen über die Leistung hier. Es sollte schnell sein.

+0

Um die Wahrheit zu sagen, ich habe die grundlegenden Kenntnisse von Java in diesem Stadium so im Grunde haben keine Ahnung, was Sie über die 'Comparable' Schnittstelle gesagt haben. Aber ich werde jetzt schauen und sehen, ob ich etwas tun kann. :) – Azazel

+0

Ah. Es tut uns leid. Überprüfen Sie in diesem Fall die Schnittstellen im Allgemeinen und machen Sie Ihre Klasse zu einer Instanz einer Schnittstelle, und schauen Sie sich dann die Schnittstelle "Vergleichbar" an. Sobald Sie das erledigt haben, wird das Sortieren die einfachste Sache aller Zeiten sein. – dvaergiller

+0

Danke, Ich werde weitermachen. :) Hast du eine Ahnung, was eigentlich mit meinem Code nicht stimmt? – Azazel

0

Es ist sehr einfach, mit Java tun 8:

//grouping by alphabet 
Map<Character, List<Integer>> groupedTerms = terms.stream().collect(Collectors.groupingBy(Term::getElement))) 
//Calculate count 
Map<Character, Int> calculated = groupedTerms.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().stream().mapToInt(Integer::intValue).sum())); 
//And sort 
Map<Character, Int> result = calculated.stream().sorted(Map.Entry.byKeyComparator()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 

Als Ergebnis erhalten Sie Karte Typ sortiert haben - Int:

["A"-> 10, "C" -> 5] 
Verwandte Themen