2017-09-28 2 views
1

は、私が持つコンパレータを作成するための任意の便利な方法がある場合は、優先順位リストは、私が疑問に思って[B, A, C, D, F ...]比較のための優先順位リストを取るコンパイラをJavaで作成するには?私のシナリオで

かもしれAAC前に来る前にBが来ることを、文字列のリストを比較したいですそのような優先リスト?私はオンラインでは見つかりませんでした。

+2

を'Comparator'の内部で比較するための' indexOf' – QBrute

+0

@QBruteありがとうございました! – xxx222

答えて

3

外部ライブラリを使用しても構わない場合、GuavaのOrdering.explicitは通常、値のリストを希望の順序で提供し、Comparatorを作成します。

あなたが順序で文字の小さなリストを持っている場合は、この順番で文字列辞書的にを比較したい場合はそうでない場合、あなたはおそらく、それは少しだ...

Comparator<Character> cmp = Comparator.comparingInt("BACDF..."::indexOf); 

で逃げることができおそらくより明示的に書く必要があります。

Comparator<String> cmp = (a, b) -> { 
    for (int i = 0; i < a.length() && i < b.length(); i++) { 
    if (a.charAt(i) != b.charAt(i)) { 
     String ordering = "BACDF..."; 
     return ordering.indexOf(a.charAt(i)) - ordering.indexOf(b.charAt(i)); 
    } 
    } 
    return a.length() - b.length(); 
} 
1

@Louisからの答えはかなり良いですが、あなたは< java8 とグアバせずにソリューションを必要と何とか場合は、その後collatorsの使用を考慮してください。

List<String> myList = new ArrayList<>(); 
myList.add("car"); 
myList.add("distro"); 
myList.add("bar"); 
myList.add("air"); 
myList.add("folk"); 
String simple = "< b< a< c< d"; 
RuleBasedCollator mySimple = new RuleBasedCollator(simple); 
System.out.println(myList); 
Collections.sort(myList, mySimple); 
System.out.println(myList); 

出力は

のようになります。

ソート前

[car, distro, bar, air, folk] 

[bar, air, car, distro, folk] 
3

をソートした後に、簡単なStringに必要な順序を保存することができ、その後、このようないくつかのlist、ソートするために、このStringでのcharのインデックスを使用します。あなたが使用することができ

public static void main(String argv[]) { 
    String order = "BACDFE"; 
    List<String> myList = new ArrayList<>(Arrays.asList("A", "B", "C", "D", "E", "F")); 

    System.out.println(Arrays.toString(myList.toArray())); //[A, B, C, D, E, F] 

    myList.sort(Comparator.comparingInt(order::indexOf)); 

    System.out.println(Arrays.toString(myList.toArray())); //[B, A, C, D, F, E] 
} 
関連する問題