2016-11-15 23 views
1

私のプログラムではCollections sortメソッドを使用して文字列のArrayListを辞書的にソートする必要がありますが、各Stringには対応する整数値が別のArrayListに格納されています。整数値が正しい文字列にとどまるように、それらを同じように並べ替える必要があります。両方の値を保存する方が良い方法を知っていれば、私はすべて耳にします。Collections並べ替えて両方のArrayListを並べ替える

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

数値的にまたは辞書的にソートしますか?しかし、おそらくあなたはマップにそれらを保存することができます。 – bradimus

+0

Lexicograpically –

+0

文字列から整数へのマップを使用し、次にキーをソートし、ソート順に値を引き出しますか? –

答えて

4

あなたの抽象概念が間違っています。その文字列とその数値が一緒に属している場合は、ではなくの2つのの別個のリストに保ちます。

代わりに、これらの2つの値を保持するクラスを作成してください(または、おそらく既存のPairクラスのいずれかを使用してください)。そのクラスに対してequalsメソッドを提供することができます。文字列要素のみを比較する特定のcomparatorを加えたものです。

最後に、リストにそのクラスのオブジェクトを配置します。次にのリストに並べ替えます。

良いOOプログラミングのアイデアは、有用な抽象度を作成することです

dnaultが示唆しているように、実際に文字列と数字の間に「タイト」な結合がない場合は、TreeMapTreeMap<String, Integer>として使用)を使用して数値を持つ文字列を並べ替えることができます。私は二つのリストは良いアイデアだとは思わない、が

+2

TreeMap は実行可能な代替方法でもあります。 – dnault

+0

@dnault私は犬を歩いている間、同じ考えを持っていた。しかし、あなたに感謝します。それに応じて私の答えを更新しました。 – GhostCat

0

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

を試してみてください。

0

マップを使用して、各一意のStringキーをInteger値に関連付ける必要があります。

次に、keySet()によって返されたマップのキーセットでCollections.sortを呼び出すことができます。

さらに、TreeMapなどのSortedMapを使用する場合は、キーを並べ替える必要はありません。しかし、その解決策はあなたの「課題5の問題1b」の要件を満たしていない可能性があります。

関連する問題