2015-09-17 9 views
7

こんにちは私は先行ゼロの入力として文字列リストを持っていると私はそれらを並べ替える方法が不思議です。 " - "(ソートされていない)(ソート)Javaで先行ゼロの数字をソートする方法は?

0-2 
0-1 
1 
1-2 
1-0 
1-1 
4-3 

出力

0-1 
0-2 
1 
1-0 
1-1 
1-2 
4-3 

私は削除することができます

入力し、先頭のゼロが、その後0-1 -> 11 -> 1は同じであるとすることはできませんソートされる。私の心に来る他のものはゼロ、その後のJavaソートと開始位置でのバックナンバーが、並べ替えを使用するので、

0-1->1 
1->10 
10->100 

の後ろに0を置くためにゼロをリードしていないこれらの数字に削除するのですか?

編集:

  • 構造はとても深さに1-2-3-4-5-6無制限です...
  • 私は(0
  • だけダッシュをリードするだけで1を持つことができます - )とポイント(。)はデシメートルが許されます。
+1

あなたは常にダッシュを1つしか持たないケースですか?あるいは構造がより複雑になるか? – ojblass

+0

あなたはいくつ持っていますか?マックス2?無制限? – Puce

+2

何を試しましたか? - 文字列の自然な並べ替え順序が必要なものかどうかを確認しましたか? – JimmyB

答えて

8

私は-文字で文字列を分割したいし、各部分がintに変換:

public class StringPartsComparator implements Comparator<String> { 

    @Override 
    public int compare (String s1, String s2) { 
     String[] arr1 = s1.split("-"); 
     int len1 = arr1.length; 

     String[] arr2 = s2.split("-"); 
     int len2 = arr2.length; 

     int commonLength = Math.min(len1, len2); 

     // Go over the "common" elements. 
     // Return if any element differs from its counterpart 
     for (int i = 0; i < commonLength; ++i) { 
      int int1 = Integer.parseInt(arr1[i]); 
      int int2 = Integer.parseInt(arr2[i]); 
      int comp = Integer.compare(int1, int2); 
      if (comp != 0) { 
       return comp; 
      } 
     } 

     // All the common elements are equal, 
     // the longer string should be considered "bigger" 
     return Integer.compare(len1, len2); 
    } 
} 

今、ちょうどあなたの文字列を並べ替えるために、このカスタムコンパレータを使用します。

List<String> myList = ...; 
Collections.sort(myList, new StringPartsComparator()); 
+2

リストが 'String'型であれば必要な出力は自然順序*ですか?カスタムコンパレータを使わずに 'Collections.sort'で直接ソートすることができます。 –

+2

@TAskもしOPの最大値が9であった場合、( "" 10 "<" 2 "') – Hacketo

+3

@TAskセパレータ間の値が1桁に制限されていると仮定すると、自然順序付けはうまくいくはずです。しかし、私が理解したところでは、セパレータ間の要素は数字を表しているので、 '' 11-1 ''' 2-0''の後ろに来るようにしたいので、自然順序付けは不十分です。 – Mureinik

関連する問題