2016-11-15 3 views
1

Mein Programm muss die Sortiermethode Collections verwenden, um die ArrayList von Strings lexikographisch zu sortieren, aber jeder String hat einen entsprechenden ganzzahligen Wert, der in einer separaten ArrayList gespeichert ist. Ich möchte sie beide gleich sortieren, damit die Integer-Werte bei den richtigen Strings bleiben. Und wenn Sie einen besseren Weg kennen, um beide Werte zu speichern, bin ich ganz Ohr.Sammlungen Sortieren, um beide ArrayLists zu sortieren

public class a5p1b { 
    public static void main(String[] args) { 

     Scanner input = new Scanner(System.in).useDelimiter("[^a-zA-z]+"); 
     // ArrayLists to store the Strings and the frequencies 
     ArrayList<String> lst = new ArrayList<String>(); 
     ArrayList<Integer> intLst = new ArrayList<Integer>(); 

     //loops through as long as there is user input 
     while (input.hasNext()) { 
      String str = input.next().toLowerCase(); 
      // if the list already has the string it doesn't add it and it 
      // ups the count by 1 
      if (lst.contains(str)) { 
       int index = lst.indexOf(str); 
       intLst.set(index, intLst.get(index) + 1); 
      } else { 
       // if the word hasnt been found yet it adds it to the list 
       lst.add(str); 
       intLst.add(1); 
      } 
     } 
    }  
} 
+0

Möchten Sie sie numerisch oder lexikografisch sortiert haben? Aber vielleicht könnten Sie sie in einer Karte speichern. – bradimus

+0

Lexikographisch –

+0

Verwenden Sie eine Zuordnung von Strings zu Ganzzahlen, sortieren Sie dann die Schlüssel und ziehen Sie die Werte in sortierter Reihenfolge heraus? –

Antwort

4

Sie erhalten Ihre Abstraktionen falsch. Wenn diese Zeichenfolge und diese Nummer zusammen gehören, dann tun Sie nicht halten sie in zwei verschiedenen Listen.

Erstellen Sie stattdessen eine Klasse (oder verwenden Sie eine der vorhandenen Klassen Pair), die diese beiden Werte enthält. Sie können dann eine equals-Methode für diese Klasse bereitstellen. plus eine spezifische comparator, die nur die String-Elemente vergleicht.

Schließlich fügen Sie Objekte dieser Klasse in eine einzelne Liste; und dann sortieren Sie , die Liste.

Die ganze Idee von guter OO-Programmierung ist hilfreich Abstraktionen zu erstellen!

Für das Protokoll: als dnault schon sagt, wenn es mit ihnen zwischen Strings und Zahlen Sie könnten auch ein verwenden TreeMap (zur Verwendung als TreeMap<String, Integer>) zu kümmern Sortierfolgen, die eine Nummer haben wirklich keine „tight“ Kupplung .

+2

TreeMap könnte auch eine praktikable Alternative sein. – dnault

+0

@dnault Ich hatte die gleiche Idee beim Gehen mit dem Hund; aber danke für deine Eingabe; Ich habe meine Antwort entsprechend aktualisiert. – GhostCat

0

Versuchen

inList.sort(Comparator.comparing(i -> i.toString()); 

Obwohl ich nicht glaube, die beiden Listen eine gute Idee ist.

0

Sie sollten eine Zuordnung verwenden, um jedem eindeutigen Zeichenfolgenschlüssel einen Integer-Wert zuzuordnen.

Dann können Sie Collections.sort auf dem Schlüsselsatz der Karte aufrufen, der von keySet() zurückgegeben wird.

Wenn Sie eine SortedMap wie TreeMap verwenden, ist es außerdem nicht erforderlich, die Schlüssel zu sortieren. Diese Lösung erfüllt jedoch möglicherweise nicht die Anforderungen Ihres "Aufgabe 5 Problem 1b".

Verwandte Themen