1

値に基づいてソートされた TreeMap があり、次のように出力されます。

abortion-2
able-2
ab-2
aaron-2
aaa-2
aa-2
a-2
absent-1
absence-1
abraham-1
ability-1
aberdeen-1
abc-1

しかし、同じ値を持つ単語が逆のソート順で出力されているようです:

「 a, aa, aaa, aaron, ab, できる中絶」などの代わりに、「abortion, ab, ab, aaron, aaa, aa, a 」など。

同じ値を持つキーの各セットを TreeSet に追加して出力することも考えましたが、次の値に基づいて反復できませんでした。

TreeMap に渡すコンパレータを次に示します。コードを修正して正しい順序で印刷するのを手伝ってくれる人はいますか?

 public class MyComparator implements Comparator<String>{
    Map<String, Integer> tiedMap; 

    public MyComparator(Map<String, Integer> map){
       this.tiedMap = map; 
    }        

    public int compare(String a, String b){
        if(tiedMap.get(a)>=tiedMap.get(b)){
            return -1;
        }
        else
            return 1;
    }
}

そして、これが私がそれを印刷しようとしている方法です:

Iterator it = tree.entrySet().iterator();
for(int i=0; i<n; i++){
   if(it.hasNext()){
      Map.Entry pairs = (Map.Entry)it.next();
      System.out.println(pairs.getKey()+"-"+pairs.getValue());
   }
}

編集: 入力を TreeMap に読み込んでから、別の TreeMap に渡します。

編集: TreeMaps を作成するコード:

Map<String, Integer> map = new TreeMap<String, Integer>();        
Words t = new Words();         
MyComparator comp = w.(new MyComparator(map));       
Map<String, Integer> tree = new TreeMap<String, Integer>(comp); 

int size = Integer.parseInt(buffer.readLine());
   for(int i = size; i>0; i--){
       reader = buffer.readLine();
       if(map.get(reader)!=null){
          map.put(reader, map.get(reader)+1);
       }
       else
          map.put(reader, 1);                
   }
tree.putAll(map);      
4

4 に答える 4

1

コンパレータは、値のみに基づいて逆順でソートされたエントリを返します。これは、あなたの望むことですか?

また、より予測可能な順序でエントリが必要な場合は、キーも比較する必要があります。

public int compare(String a, String b)
{
    Integer aVal = tiedMap.get(a);
    Integer bVal = tiedMap.get(b);

    if (aVal > bVal)
    {
        return 1; // or -1 for descending order
    }
    else if (aVal < bVal)
    {
        return -1; // or 1 for descending order
    }
    else
    {
        // if values are equivalent compare on key as well
        return a.compareTo(b);
        // or for descending order:
        // return b.compareTo(a);
    }
}
于 2013-01-31T07:43:06.053 に答える
1
if(tiedMap.get(a)>=tiedMap.get(b)){
    return -1;
}
else
    return 1;

値が同じ場合に 0 を返すようにコードを変更する必要があります。これにより、元のキー間の相対的な順序が変更されないことが保証されます。それでもうまくいかない場合は、次のようなコードを追加できます。

if (tiedMap.get(a) == tiedMap.get(b))
  return a.compareTo(b);
于 2013-01-31T07:04:32.333 に答える
0

実はコンパレーターを使えば、HashMap, TreeMap昇順・降順で並べ替えることができます。

これを試してください:

// sort list based on comparator
    Collections.sort(list, new Comparator() {
        public int compare(Object o1, Object o2) {
            return ((Comparable) ((Map.Entry) (o2)).getValue())
                                   .compareTo(((Map.Entry) (o1)).getValue());
        }
    });

これにより、出力が降順になります。によってinterchanging the o2 and o1 only、昇順でソートされます。

于 2013-01-31T07:32:34.587 に答える
-1

あなたの期待/実装を完全に理解しているかどうかはわかりませんが、比較関数で文字列 a と b を文字間で比較する必要があると思います。

于 2013-01-31T06:53:52.783 に答える