String.CompareToコンパレータを使用して、文字列の静的配列をソートおよびバイナリ検索したいと思います。
問題は、並べ替えとバイナリ検索の両方でComparatorオブジェクトを渡す必要があることです-では、組み込みの文字列コンパレーターをどのように渡すのでしょうか?
Arrays
クラスには、sort()
およびbinarySearch()
のバージョンがあり、_Comparator.
_を必要としません。たとえば、 Arrays.sort()
はオブジェクトの配列のみを受け取ります 。これらのメソッドは、配列内のオブジェクトのcompareTo()
メソッドを呼び出します。
独自のコンパレータを書くことができます
public class ExampleComparator implements Comparator<String> {
public int compare(String obj1, String obj2) {
if (obj1 == obj2) {
return 0;
}
if (obj1 == null) {
return -1;
}
if (obj2 == null) {
return 1;
}
return obj1.compareTo(obj2);
}
}
Java 8に基づくソリューション Java.util.Comparator.comparing(...) :
Comparator<String> c = Comparator.comparing(String::toString);
または
Comparator<String> c = Comparator.comparing((String x) -> x);
Comparator
が必要で、すでに Guava
を使用している場合は、 Ordering.natural()
を使用できます。
これは、Comparator
だけでなく、あらゆる種類のComparable
オブジェクトの汎用String
です。
package util;
import Java.util.Comparator;
/**
* The Default Comparator for classes implementing Comparable.
*
* @param <E> the type of the comparable objects.
*
* @author Michael Belivanakis (michael.gr)
*/
public final class DefaultComparator<E extends Comparable<E>> implements Comparator<E>
{
@SuppressWarnings( "rawtypes" )
private static final DefaultComparator<?> INSTANCE = new DefaultComparator();
/**
* Get an instance of DefaultComparator for any type of Comparable.
*
* @param <T> the type of Comparable of interest.
*
* @return an instance of DefaultComparator for comparing instances of the requested type.
*/
public static <T extends Comparable<T>> Comparator<T> getInstance()
{
@SuppressWarnings("unchecked")
Comparator<T> result = (Comparator<T>)INSTANCE;
return result;
}
private DefaultComparator()
{
}
@Override
public int compare( E o1, E o2 )
{
if( o1 == o2 )
return 0;
if( o1 == null )
return 1;
if( o2 == null )
return -1;
return o1.compareTo( o2 );
}
}
String
の使用方法:
Comparator<String> stringComparator = DefaultComparator.getInstance();
繰り返しになりますが、Arrays.binarySearch(Object[] a, Object key)
のコンパレーターは、オブジェクトのタイプが比較可能である限り必要ありませんが、ラムダ式を使用すると、これがはるかに簡単になります。
コンパレータをメソッド参照に置き換えるだけです:String::compareTo
例えば。:
Arrays.binarySearch(someStringArray, "The String to find.", String::compareTo);
また使用することができます
Arrays.binarySearch(someStringArray, "The String to find.", (a,b) -> a.compareTo(b));
しかし、ラムダの前でさえ、常に匿名クラスがありました:
Arrays.binarySearch(
someStringArray,
"The String to find.",
new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
わかりました。これは数年後ですが、Java 8でComparator.naturalOrder()を使用できます:
http://docs.Oracle.com/javase/8/docs/api/Java/util/Comparator.html#naturalOrder--
Javadocから:
static <T extends Comparable<? super T>> Comparator<T> naturalOrder()
Comparableオブジェクトを自然な順序で比較するコンパレータを返します。返されるコンパレータはシリアル化可能で、nullを比較するときにNullPointerExceptionをスローします。
また、大文字と小文字を区別しない比較が必要な場合は、Javaの最近のバージョンでは、String
クラスにpublic static final
というフィールドCASE_INSENSITIVE_ORDER
これはタイプComparator<String>
、私が最近発見したように。そのため、String.CASE_INSENSITIVE_ORDER
。
String.CASE_INSENSITIVE_ORDERコンパレータを使用して、大文字と小文字を区別しない順序で文字列を比較できます。
Arrays.binarySearch(someStringArray, "The String to find.",String.CASE_INSENSITIVE_ORDER);
Mike Nakisの良い答えをString.CASE_INSENSITIVE_ORDER
で一般化するには、以下を使用することもできます:
Collator.getInstance();
Collator を参照してください