2017-03-11 7 views
3

現在、AndroidのTabLayoutのタイトルを設定するためにArrayListを渡しています。配列内の要素は文字列です:["RCP", "RYL", "1", "2", "3", "4", "5", "6"].しかし、必ずしもそうではありません。数字の前の文字でJava ArrayListをソートする

最初に(アルファベット順に)レター要素を指定してリストを返し、次に整数を増分して返します。私はCollections.sortメソッドを使用して試してみましたが、これは上昇を数値と最後の「R」の文字列を追加するリストを返す

["1", "2", "3", "4", "5", "6", "RCP", "RYL"]

を明確にするためにそれを返すように、私は、私のArrayListをソートしたいと思います["RCP", "RYL", "1", "2", "3", "4", "5", "6"] "R"文字列のタイトルが変更される可能性があるため、柔軟性が必要です。

おかげ

+3

カスタムを使用していない場合にはComparatorインタフェースを実装する匿名の内部クラスを使用することができます。 – duffymo

+0

整数も変わる可能性がありますか?ある時点で2桁以上の数字があり、結果に「10」の前に「9」が表示されますか? –

+0

整数には文字列値の接尾辞が付いている可能性があります。私。 '[" 1AB "、" 1AV "]'。次に、最初に文字列接頭辞の順で、次に '[" "RCA"、 "RLM"、 "1EP"、 "1FT"、 "2LJ"、 "2MO"]の順に印刷する必要があります。 。私はまだこれをチェックしていません... – dantan04

答えて

2

文字列以外の文字列に優先する文字列を優先する場合は、Comparatorを作成してCollections.sortメソッドに渡すことを検討する必要があります。

これは簡単な方法です。文字列のいずれかが数字かどうかを確認し、数字の場合は数字以外の文字列を優先します。両方が数字または文字列の場合は、文字列のcompareToメソッドを使用します。

希望します。

public class Main { 

    private static int customCompare(String a, String b) { 
     return isThereAnyNumber(a, b) 
       ? isNumber(a) ? 1 : -1 
       : a.compareTo(b); 
    } 

    private static boolean isThereAnyNumber(String a, String b) { 
     return isNumber(a) || isNumber(b); 
    } 

    private static boolean isNumber(String s) { 
     return s.matches("[-+]?\\d*\\.?\\d+"); 
    } 

    public static void main(String[] args) { 
     List<String> list = Arrays.asList("RCP", "RYL", "1", "2", "3", "4", "5", "6"); 
     Collections.sort(list, Main::customCompare); 
     System.out.println(list); 
    } 
} 

UPDATE

あなたは、コンパレータが働くかもしれないのJava 8

public class Main { 

    public static void main(String[] args) { 
     List<String> list = Arrays.asList("RCP", "RYL", "1", "2", "3", "4", "5", "6"); 
     Collections.sort(list, new Comparator<String>() { 
      private boolean isThereAnyNumber(String a, String b) { 
       return isNumber(a) || isNumber(b); 
      } 

      private boolean isNumber(String s) { 
       return s.matches("[-+]?\\d*\\.?\\d+"); 
      } 

      @Override 
      public int compare(String a, String b) { 
       return isThereAnyNumber(a, b) 
         ? isNumber(a) ? 1 : -1 
         : a.compareTo(b); 
      } 
     }); 
     System.out.println(list); 
    } 
} 
+0

あなたの努力に感謝します。 AndroidではCollections.sort(list、Main :: customCompare);を呼び出すことはできませんが、「メソッド参照はこの言語レベルではサポートされていません」とスローされます。何か案は? – dantan04

+0

@ dantan04 Java 8を使用していない場合やAndroidで使用していた(メソッド参照などの)いくつかのものはサポートされていないため、lambdaを使用しない新しいソリューションを提供しました。今はうまくいくと思っています。 – acontell

+0

これは多くの助けになります!私はこれを経由して作成しました: 'コレクション。ソート(リスト、新しいコンパレータ(){ @Override 公共intは(文字列の文字列T1){ customCompare(S、T1)を比較; 戻り0; } }); ' リストを返します: '' "6"、 "5"、 "4"、 "3"、 "2"、 "1"、 "R"] '今は逆にする必要があります。 – dantan04

4

、あなたのアイテムのソート順を定義することができますComparatorになりますCollections.sortための過負荷は、あります。この場合、あなたがしているようにComparatorインターフェイスの独自の実装を定義するだけです。

+0

ありがとう、私は 'Comparator'のドキュメントを読んでいます。 (私は現在、良い本からアンドロイドを学んでいるので、着実に進歩しています)。 – dantan04

関連する問題