2017-11-13 6 views
1

マップを持ち、値の長さと文字列の長さをソートしようとしています。私は2つの異なるステートメントが必要かどうかわからないので、ステートメント内の2つの異なるものを比較しようとしています。これはディジットルートを比較するために使用されているため、ストリングの長さとディジットルートは値と値です。例えば複数のフィールドで整数、文字列のセットを並べ替え

("103",4); (1+0+3 == 4) 
("4",4); (4 ==4) 
("11101",4); (1+1+1+0+1 == 4) 
("5",5); (5 == 5) 
("1003",4); (1+0+0+3 == 4) 

しかし("103",4) > ("4",4) "103"> "4" の長さ、および("11101",4) > ("103",4);、長さ"11101" > "103"

Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { int length = o1.getKey().length().compareTo(o2.getKey().length()); 
if(length != 0) { 
return length; 
} 
return (o1.getValue()).compareTo(o2.getValue()); 
} 
}); 

はなぜこの仕事をしていないので?

+0

文字列の値と長さはどういう意味ですか? –

+0

'Collections.sort(リストリスト)'はリスト用です。あなたは代わりにTreeMapを使うことができます – haifzhan

+0

これはあなたが求めているものと推測できますhttps://stackoverflow.com/questions/25899929/in-java-sort-hash-map-by-its-key-length –

答えて

2

、その後な長さのキーによって、その値によって、あなたはすでにマップを持って、そしてあなたがそれを注文したい場合:

Map<String,Integer> unsortMap = new TreeMap<String,Integer>(); 

unsortMap.put("103",4); 
unsortMap.put("4",4); 
unsortMap.put("11101",4); 
unsortMap.put("5",5); 
unsortMap.put("1003",4); 

Map<String, Integer> result = unsortMap.entrySet().stream() 
     .sorted(Map.Entry.comparingByKey(Comparator.comparingInt(String::length)) 

     ).sorted(Map.Entry.comparingByValue()) 
     .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
       (oldValue, newValue) -> oldValue, LinkedHashMap::new)); 


System.out.println(result); 

out => {4=4, 103=4, 1003=4, 11101=4, 5=5} 
+0

私はそれが機能を見つけることができないことがわかります。私はこれが私が探しているものだと思いますが、私はこの種のものになると、既に@Damian Lattenero @ tremapを持っています –

+0

@April_Nara私は答えを更新しました!それが有用だったら受け入れることを忘れないでください –

+0

それは私がそれを今でもしたいことをしません。値をソートするにはまだそれが必要です。第2の解決策は長さだけである。私は助けに感謝します。 –

1

あなたがいる場合は、この方法で比較することができます長さで並べ替えることを目指しています。

Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 

    @Override 
    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 
     // TODO Auto-generated method stub 

     if (o1.getKey().length() == o2.getKey().length()) { 
      return 0; 
     } 

     if (o1.getKey().length() > o2.getKey().length()) { 
      return 1; 
     } else { 
      return -1; 
     } 

    } 

}); 
+0

これは良い答えです、プラス1つです;)、あなたはそれを短くすることができますしたい場合は私の答えを見てください –

+0

ありがとう:)私はチェックし、私は本当にそのように好きですが、なぜなら、それはコードビットをデバッグフレンドリにするからです:一般的にPです。 – Simmant

+0

ありがとうございますが、これでも値で並べ替えるという問題は解決しません。 –

0

あなたはそれが動作しない理由を言っていません。試してみるとどうなりますか?

Javaでは、Mapはソートされていないため、高速アクセスが目的です。 しかし、TreeMapのような実装では、確定的な順序付けが維持され、ソートが可能です。あなたのコードは、マップのEntrySetをソートしようとしていることを示唆しています。 Java Setも順序はなく、ソートすることはできません。

TreeMapのようなNavigableMapを使用するか、SetではなくListを使用することをお勧めします。 Java Listには注文があり、Collections.sort(...)を使用してソートすることができます。

既存のコードが機能しない理由はいくつかあります。まず、into1.getKey().length().compareTo(...))のcompareToに電話をかけようとしています。これは不可能です。代わりに、次のものを使用できます:

Ints.compare(o1.getKey().length(), o2.getKey().length()); 
+0

質問は本当に対処されていません。なぜなら、もし私ができるかどうかわからないから、比較文で2つのことを比較できるはずです。 –

+0

質問が更新されました。今すぐあなたの答えを確認してください –

関連する問題