2017-09-06 6 views
-3

私は少しグーグルではありますが、このような特定の問題の解決策を見つけることができませんでした。私はのPOJOを持っています。フィールドにはdisplayCode(String型)というフィールドがあります。 displayCodeは異なるフォーマットを持つことができます。いくつかの例:キャストなしで部分的に数値の文字列を比較する

622 
622-S 
622-1 
623 
624 
625 
625-S 
625-1 
625-1-S 
625-2 
625-2-S 

並べ替え後も、上に示した順序にする必要があります。明らかに私は必要なもの、スイートはありません

1 
10 
100 
101 
102 
... 

:通常s1.compareTo(s2);で、私はこのような順序を取得します。残念ながら私はこれをどのようにスムーズに(そして他の方法でも)達成する方法についての計画はありません。

List<String> s = new ArrayList<String>(Arrays.asList(new String[] { "622", "622-S", "622-1", "623", "625", 
     "625-S", "625-1", "625-1-S", "625-2", "625-2-S", "6", "60", "666", "1", "2", "3" })); 
Collections.sort(s,new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 

     return 0; 
    } 
}); 
System.out.println(s); 

EDITを:: 私の最初に考えたのはキャストに行くでしょう。また、私は(あなたはそれで遊ぶことができます)8.

コードテストの目的のために、Javaからは何も使用できないことに、注意してください最初の-までの数字をintに変換し、それを比較して、他の部分と同じように作業してください。しかし、これは滑らかに聞こえません。

+0

* smooth *を心配する前に、* works *に焦点を当てることができます。 –

+0

あなたの唯一の問題は、通常の比較があなたに与えるので、最後にSと思われる: 1,2,3,6,60,622,622-1,622-S、623,625,625-1,625 -1-S、625-2,625-2-S、625-S、666 –

+0

実際に上記の配列の要素の「不良」ソートを表示できますか? –

答えて

1

文字列の数字部分を分離し、数値に変換し、それらを比較し、それらが等しい場合にのみ文字列の辞書編集比較を行います。

これらの線に沿って、例えば、(概念は、おそらく微調整が必​​要になります):

@Override 
public int compare(String o1, String o2) { 
    String[] p1 = o1.split(" ", 2); 
    String[] p2 = o2.split(" ", 2); 
    try { 
     int n1 = Integer.parseInt(p1[0]); 
     int n2 = Integer.parseInt(p2[0]); 
     if (n1 != n2) { 
      return n1 - n2; 
     } 
     boolean s1 = p1.length > 1 && p1.equals("S"); 
     boolean s2 = p2.length > 1 && p2.equals("S"); 
     if (s1 && !s2) { 
      return -1; 
     } 
     if (!s1 && s2) { 
      return 1; 
     } 
    } catch (NumberFormatException e) { 
    } 
    return o1.compareTo(o2); 
} 
+0

私は次に行く必要があるように聞こえます – XtremeBaumer

+1

POJOのコンストラクタ/セッターは、 'displayCode'を数値と文字列に分割して、別々のフィールドとして保持することを考えてみましょう。これはcompareメソッドを単純化し、もし 'List'が大きければソートを速くするでしょう。 –

0

Java文字列は、あなたのPOJOの数値部分を分離するために使用することができますsplit方法を、持っています。 parseIntを使用してPOJOを整数として取得することができます。これにより、簡単な方法で並べ替えることができます。

1

これは役に立ちます。

Collections.sort(s, new Comparator<String>() { 

      public int compare(String o1, String o2) { 
       int returnValue = -1; 

       Integer left = returnIfNumeric(o1); 
       Integer right = returnIfNumeric(o2); 

       // if both values are number 
       if (left != null && right != null) { 
        if (left > right) 
         returnValue = 1; 
        else if (left == right) 
         returnValue = 0; 
        else 
         returnValue = -1; 
       } 
       // if both values are string 
       else if (left == null && left == right) { 
        return o1.compareTo(o2); 
       } 
       // if left is number 
       else if (left != null) { 
        returnValue = -1; 
       } 
       // if left is string 
       else { 
        returnValue = 1; 
       } 

       return returnValue; 
      } 
     }); 

    } 

    public static Integer returnIfNumeric(String str) { 
     Integer number = null; 
     try { 
      number = Integer.valueOf(str); 
     } catch (NumberFormatException nfe) { 
      number = null; 
     } 
     return number; 
    } 
関連する問題