は、私が持つコンパレータを作成するための任意の便利な方法がある場合は、優先順位リストは、私が疑問に思って[B, A, C, D, F ...]
比較のための優先順位リストを取るコンパイラをJavaで作成するには?私のシナリオで
かもしれA
とA
がC
前に来る前にB
が来ることを、文字列のリストを比較したいですそのような優先リスト?私はオンラインでは見つかりませんでした。
は、私が持つコンパレータを作成するための任意の便利な方法がある場合は、優先順位リストは、私が疑問に思って[B, A, C, D, F ...]
比較のための優先順位リストを取るコンパイラをJavaで作成するには?私のシナリオで
かもしれA
とA
がC
前に来る前にB
が来ることを、文字列のリストを比較したいですそのような優先リスト?私はオンラインでは見つかりませんでした。
外部ライブラリを使用しても構わない場合、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();
}
@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]
をソートした後に、簡単な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]
}
を'Comparator'の内部で比較するための' indexOf' – QBrute
@QBruteありがとうございました! – xxx222