web-dev-qa-db-ja.com

Java String CompareToをコンパレータオブジェクトとして取得

String.CompareToコンパレータを使用して、文字列の静的配列をソートおよびバイナリ検索したいと思います。

問題は、並べ替えとバイナリ検索の両方でComparatorオブジェクトを渡す必要があることです-では、組み込みの文字列コンパレーターをどのように渡すのでしょうか?

30

Arraysクラスには、sort()およびbinarySearch()のバージョンがあり、_Comparator._を必要としません。たとえば、 Arrays.sort()はオブジェクトの配列のみを受け取ります 。これらのメソッドは、配列内のオブジェクトのcompareTo()メソッドを呼び出します。

19
Code-Apprentice

独自のコンパレータを書くことができます

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);
  }
}
37
kosa

Java 8に基づくソリューション Java.util.Comparator.comparing(...)

Comparator<String> c = Comparator.comparing(String::toString);

または

Comparator<String> c = Comparator.comparing((String x) -> x);
28
Antonio

Comparatorが必要で、すでに Guava を使用している場合は、 Ordering.natural() を使用できます。

11

これは、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();
10
Mike Nakis

繰り返しになりますが、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);
                    }
                });
9
Joseph Nields

わかりました。これは数年後ですが、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をスローします。

6
brunesto

また、大文字と小文字を区別しない比較が必要な場合は、Javaの最近のバージョンでは、Stringクラスにpublic static finalというフィールドCASE_INSENSITIVE_ORDERこれはタイプComparator<String>、私が最近発見したように。そのため、String.CASE_INSENSITIVE_ORDER

6
Mike Nakis

String.CASE_INSENSITIVE_ORDERコンパレータを使用して、大文字と小文字を区別しない順序で文字列を比較できます。

Arrays.binarySearch(someStringArray, "The String to find.",String.CASE_INSENSITIVE_ORDER);
2
Sudhakar

Mike Nakisの良い答えをString.CASE_INSENSITIVE_ORDERで一般化するには、以下を使用することもできます:

Collator.getInstance();

Collat​​or を参照してください

0
Sharcoux