2013-05-14 10 views
9

を注文すると文字列の配列をソート私は<code>String</code>配列を持つカスタム

FCBWHJLOAQUXMPVINTKGZERDYS

私はイムにする必要があると思うplement Comparatorcompare方法オーバーライドします。

Arrays.sort(str, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      // TODO Auto-generated method stub 
      return 0; 
     } 
    }); 

どのように私はこれを解決するに取り掛かる必要がありますか?

+2

まず、項目の長さが常に1文字の場合は、文字配列の使用を検討する必要があります。文字列を使用すると、より多くのエラーチェックが行われます –

+0

@DuncanJonesいいえ、そうではありません。これは単なる例です。私はそれらを変更しました。ありがとう – Sam

+0

@Sam:文字列内の個々の文字を順序で並べ替える必要があり、「通常の」文字列規則が適用されますか? 「AA」は「A」に比べてどのようにソートされていますか?または "FB"に対する "FC"? –

答えて

26
final String ORDER= "FCBWHJLOAQUXMPVINTKGZERDYS"; 

Arrays.sort(str, new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     return ORDER.indexOf(o1) - ORDER.indexOf(o2) ; 
    } 
}); 

また、追加することができます。

o1.toUpperCase() 

あなたの配列がイン大文字と小文字が区別されます。それは少し複雑ですので


どうやらOPは、文字が、文字の文字列だけでなく、比較したい:ここ

public int compare(String o1, String o2) { 
     int pos1 = 0; 
     int pos2 = 0; 
     for (int i = 0; i < Math.min(o1.length(), o2.length()) && pos1 == pos2; i++) { 
      pos1 = ORDER.indexOf(o1.charAt(i)); 
      pos2 = ORDER.indexOf(o2.charAt(i)); 
     } 

     if (pos1 == pos2 && o1.length() != o2.length()) { 
      return o1.length() - o2.length(); 
     } 

     return pos1 - pos2 ; 
    } 
+3

注意:大文字小文字の混乱がたくさんあります。 –

+0

@JoachimSauerが編集を追加しました。 –

+1

@MajidL *には* sensitive? – alex

0

あなたは便利なリンクを見つけることができます:

Using comparator to make custom sort

あなたの例では代わりにクラスの特定の属性を比較して、ベンチマークされたStringでcharの存在をチェックし、 er/equal/smaller。

3

私はこのような何かをするだろう:

は、ハッシュテーブル(のは、それをorderMap呼びましょう)に手紙を入れてください。キーは文字、値はORDERのインデックスです。

そして:

Arrays.sort(str, new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     int length = o1.length > o2.length ? o1.length: o2.length 
     for(int i = 0; i < length; ++i) { 
      int firstLetterIndex = orderMap.get(o1.charAt(i)); 
      int secondLetterIndex = orderMap.get(o2.charAt(i)); 

      if(firstLetterIndex == secondLetterIndex) continue; 

      // First string has lower index letter (for example F) and the second has higher index letter (for example B) - that means that the first string comes before 
      if(firstLetterIndex < secondLetterIndex) return 1; 
      else return -1; 
     } 

     return 0; 
    } 
}); 

それは、大文字と小文字を区別しない作りのためだけの先頭に両方の文字列へのtoUpperCase()を行います。

0

選択した回答を改善するために時間をかけました。これはより効率的です

public static void customSort(final String order,String[] array){ 
String[] alphabets={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9"}; 
    String keyword=order; 
    for(int g=0; g<alphabets.length; g++){ 
    String one=alphabets[g]; 
    if(!keyword.toUpperCase().contains(one)){keyword=keyword+one;} 
    } 

final String finalKeyword=keyword; 
Arrays.sort(array, new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     int pos1 = 0; 
     int pos2 = 0; 
     for (int i = 0; i < Math.min(o1.length(), o2.length()) && pos1 == pos2; i++) { 
      pos1 = finalKeyword.toUpperCase().indexOf(o1.toUpperCase().charAt(i)); 
      pos2 = finalKeyword.toUpperCase().indexOf(o2.toUpperCase().charAt(i)); 
     } 

     if (pos1 == pos2 && o1.length() != o2.length()) { 
      return o1.length() - o2.length(); 
     } 

     return pos1 - pos2 ; 
    } 
}); 
//Arrays.sort(array, Collections.reverseOrder()); 
} 
関連する問題