2016-07-12 24 views
0

私の問題は、アルファベット順を使用していない文字を比較したいのです。ここ は私の順序関係である:< B < T < Q < C < D < E < F ...アルファベット順のコンパレータをアルファベット順と異なる順序で作成する方法

どのように私は、このためのコンパレータを作成することができますか?私はこのようなすべてのケースを記述する必要があります:

if (char1.equals(char2)) { 
      return 0; 
     } else if (char1.equals("A")) { 
      return -1; 
     } else if (char1.equals("B") && char2.equals("A")) { 
      return 1; 
     } else if (char1.equals("T") 
       && (char2.equals("B") || char2.equals("A"))) { 
      return 1; 
     } else if (char1.equals("Q") 
       && (char2.equals("T") || char2.equals("B") || char2 
         .equals("A"))) { 
      return 1; 
     } else if (char1.equals("C") 
       && (char2.equals("Q") || char2.equals("T") 
         || char2.equals("B") || char2.equals("A"))) { 
      return 1; 
     } else if (char1.equals("D") 
       && (char2.equals("C") || char2.equals("Q") 
         || char2.equals("T") || char2.equals("B") || char2 
          .equals("A"))) { 
      return 1; 
     } else if (char1.equals("E") 
       && (char2.equals("D") || char2.equals("C") 
         || char2.equals("Q") || char2.equals("T") 
         || char2.equals("B") || char2.equals("A"))) { 
      return 1; 
     } else if (char1.equals("F") 
       && (char2.equals("E") || char2.equals("D") 
         || char2.equals("C") || char2.equals("Q") 
         || char2.equals("T") || char2.equals("B") || char2 
          .equals("A"))) { 
      return 1; 
     } 
+0

いただきありがとうございますか!私が理解するように、文字列ではなく、単一の文字列を比較したいだけです。 –

+2

ルックアップテーブル(char - > order)を作成し、 'lookup [char1]'と 'look [char2]'を比較してください。 – Phylogenesis

+0

1つの解決策は、リストにcharを入れてインデックスを使用することです –

答えて

2

ストアあなたは、配列の文字にしたい順に文字[]またはリスト(一覧)

は、リスト内の文字のインデックスに基づいて比較します/配列

list.indexOf(char1) - list.indexOf(char2);

+0

パフォーマンスが重要な場合は、 'LinkedList'を使用しないでください。 'ArrayList'を使うか、より良い' HashMap'を使用してください。 –

+0

@FrankPufferなぜ 'ArrayList'が' [indexOf() '](https://docs.oracle.com/javase/8/docs/api/)を使ってリストの順次検索を行うために' LinkedList'より高速だと思いますか? java/util/List.html#indexOf-java.lang.Object-)? – Andreas

+0

@アンドレアス:おそらく、ハードウェアメモリキャッシュをよりよく使用するためです。 –

1

非常に簡単な解決策があります:

まずリストにあなたの文字を入れて:

0123をその後、
char[] arrayChars= {'A','B','T', ... }; 
List<Character> sortedChars= new ArrayList<Character>(); 
for (char c : arrayChars) { // Arrays.asList won't work 
    sortedChars.add(c); 
} 

とインデックスを比較する:

int compare(char a,char b) { 
    return sortedChars.indexOf(a) - sortedChars.indexOf(b); 
} 
+0

ありがとう!それはとても見やすいです –

+0

indexOfはchar []で利用できません。私はリストを使用する必要があります –

+0

おっと、あなたは正しい、固定 –

0

あなたは、例えば、カスタム文字の順序を使用して文字列を比較RuleBasedCollatorを作成したい場合は、私はこの

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Comparator; 
import java.util.List; 

public class Compare { 

    public static void main(String[] args) { 

     final List<Character> reference = new ArrayList<Character>(
       Arrays.asList(new Character[] {'A','B','T','Q','C','D','E','F'})); 

     Character[] toBeSorted = {'A','B','C','D','E','F','Q','T'}; 

     Comparator<Character> myComparator = new Comparator<Character>() { 

      public int compare(Character o1, Character o2) { 
       Integer i1 = reference.indexOf(o1); 
       Integer i2 = reference.indexOf(o2); 
       return i1.compareTo(i2); 
      } 

     }; 

     Arrays.sort(toBeSorted, myComparator); 

     System.out.println(Arrays.asList(toBeSorted)); 

    } 


} 
6

のようにそれを行うだろう

String myRules = "< a, A < b, B < t, T < q, Q < c, C < d, D < e, E < f, F < g, G" + 
       "< h, H < i, I < j, J < k, K < l, L < m, M < n, N < o, O < p, P" + 
       "< r, R < s, S < u, U < v, V < w, W < x, X < y, Y < z, Z"; 
RuleBasedCollator myCollator = new RuleBasedCollator(myRules); 

String[] test = { "a", "B", "c", "D", "q", "T", "cc", "cB", "cq", "cT" }; 
Arrays.sort(test, myCollator); 
System.out.println(Arrays.toString(test)); 

出力

[a, B, T, q, c, cB, cT, cq, cc, D] 
0

整数(N)は、自然の秩序と呼ばれるものを運びます。したがって、実装する順序に従って、整数で索引付けされたリストにアイテムを入れるだけです。その後、2つの文字を比較するときにインデックスを比較すると、それだけです!

0

は最後に、私は文字列を使用しますが、それはそれで正常に動作します:

public class IndiceRepetitionComparator implements Comparator<String> { 

    List<String> relationOrdre = Arrays.asList("A", "B", "T", "Q", "C", "D", "E", "F", "G", "H", "I", "J", "K", 
      "L", "M", "N", "O", "P", "R", "S", "U", "V", "W", "X", "Y", "Z"); 

    @Override 
    public int compare(String indiceRepetition1, String indiceRepetition2) { 

     // même objet 
     if (indiceRepetition1 == indiceRepetition2) { 
      return 0; 
     } 

     if (indiceRepetition1 == null) { 
      return -1; 
     } 

     if (indiceRepetition2 == null) { 
      return -1; 
     } 

     return (relationOrdre.indexOf(indiceRepetition1) - relationOrdre.indexOf(indiceRepetition2) > 0) ? 1 : -1; 
    } 
} 

は、列挙型の代わりに文字を使用するほうがよいのではないでしょうあなたの助け

関連する問題