2011-01-06 5 views
1

文字列変数に格納されているこの番号を並べ替える方法はありますか?マップ内のキーを交換する方法は?

TreeMap<String,List<QBFElement>> qbfElementMap = new TreeMap<String, List<QBFElement>>();

これは、キーがマップである:

27525-1813, 
27525-3989, 
27525-4083, 
27525-4670, 
27525-4911, 
27526-558, 
27526-1303, 
27526-3641, 
27526-4102, 
27527-683, 
27527-2411, 
27527-4342 

これはキーとリストであるキーのそれぞれの値のリストです。
今、このキーを数字で昇順に並べ替えるにはどうすればいいですか?

ex。私は並べ替えたい:1,2,11,20,31,3,10
私は出力として持っていたい:1,2,3,10,11,20,31
しかし、私が使用するautosort出力は次のようになります:1,10,11,2,20,3,31

数字で昇順にソートするにはどうしたらいいですか?

と言語があなたに感謝:) javaのです:)

答えて

2

マップ内のキーはIntegerしかしString値ではありません。そのため、キーはソートされたように分類されます。

どちらか

TreeMap<Long,List<QBFElement>> qbfElementMap 

に地図を変更したり、Stringタイプキーの予想数値の順序を提供します、専門Comparatorでそれを作成します。

ロングスにあなたの文字列値からのマッピングは次のように行うことができる

private Long convertToLongTypeKey(String key) { 
    String[] parts = key.split("-"); 
    // next lines assumes, that the second part is in range 0...9999 
    return Long.parseLong(parts[0]) * 10000 + Long.parseLong(parts[1]); 
} 

Comparator<String>の実装は、2つの文字列ベースのキーの数値比較ですを作成するために同じマッピングを使用することができます。

new TreeMap<String,List<QBFElement>>(new Comparator<String>(){ 
    @Override 
    public int compare(String key1, String key2) { 
    String[] parts1 = key1.split("-"); 
    Long long1 = Long.parseLong(parts1[0]) * 10000 + Long.parseLong(parts1[1]); 
    String[] parts2 = key2.split("-"); 
    Long long2 = Long.parseLong(parts2[0]) * 10000 + Long.parseLong(parts2[1]); 
    return long1.compareTo(long2); 
    } 
}); 
+0

はい、それは文字列です。それらのキーをどのように並べ替えるのか?ここでは、文字列変数内の数字が入ります。:) –

+0

いい例(+1) –

0

TreeMapは、カスタムソート用のカスタムコンパレータを使用できます。キーをソートするコンパレータにあなたが望むように書くと、あなたはツリーマップ

TreeMap<String,List<QBFElement>> qbfElementMap = new TreeMap<String, List<QBFElement>>(myComparator); 
1

を作成するときは、TreeMapは、コンストラクタにカスタムコンパレータを提供することで、そのキーをソートする方法を変更することができ、それを使用しています。必要に応じて、文字列を数値コンポーネントに分割して比較する新しいComparatorを定義することができます。

あなたの鍵としてStringを使用しない方が良い考えです。キーとして使用しているデータは明らかにテキストではありません(数字です)、それを表すカスタムタイプを定義したい場合があります。例:

public class KeyType implements Comparable<KeyType> { 
    private final int first; 
    private final int second; 

    public KeyType(int first, int second) { 
     this.first = first; 
     this.second = second; 
    } 

    @Override 
    public boolean equals(Object other) { 
     if (!(other instanceof KeyType)) return false; 
     KeyType realOther = (KeyType) other; 
     return realOther.first == first && realOther.second == second; 
    } 

    @Override 
    public int hashCode() { 
     return first + 31 * second; 
    } 

    public int compareTo(KeyType other) { 
     if (first != other.first) 
      return first - other.first; 
     return second - other.second; 
    } 
} 

このアプローチは最も表現力があり堅牢です。それはあなたが使用しているキーの個々のフィールドへのより良いアクセスを提供し、文字列 "Lalalalala"のような無意味なキーをマップに追加するのを防ぎます。私はこのアプローチを使うことを強くお勧めします。タイプシステムはあなたの友人です。