Java将String CompareTo作为比较器对象

Geo*_*sen 34 java string object comparator

我想通过String.CompareTo比较器对一个静态字符串数组进行排序和二进制搜索.

问题是排序和二进制搜索都要求传入Comparator对象 - 那么如何传入内置字符串比较器?

kos*_*osa 38

你可以编写自己的比较器

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • `Comparator`是泛型类型,因此`ExampleComparator`应该实现`Comparator <String>`以避免警告. (8认同)
  • 你确定你应该在`obj1 == null && obj2 == null`的情况下返回`-1`吗? (3认同)
  • 也需要实现equals()。 (2认同)

Ant*_*nio 31

基于java.util.Comparator.comparing(...)的 Java 8解决方案:

Comparator<String> c = Comparator.comparing(String::toString);
Run Code Online (Sandbox Code Playgroud)

要么

Comparator<String> c = Comparator.comparing((String x) -> x);
Run Code Online (Sandbox Code Playgroud)

  • 或Comparator.comparing(Function.identity()) (5认同)

Cod*_*ice 19

Arrays班有版本sort()binarySearch()它不需要Comparator.例如,你可以使用的版本,Arrays.sort()它只是需要对象的数组.这些方法调用compareTo()数组中对象的方法.


Mic*_*vis 11

如果你确实发现你需要一个Comparator,你已经使用过Guava,你可以使用Ordering.natural().


Mik*_*kis 10

这是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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用String:

Comparator<String> stringComparator = DefaultComparator.getInstance();
Run Code Online (Sandbox Code Playgroud)


Jos*_*lds 9

同样,Arrays.binarySearch(Object[] a, Object key)只要对象类型具有可比性,就不需要比较器,但是使用lambda表达式现在更容易了.

只需用方法参考替换比较器: String::compareTo

例如:

Arrays.binarySearch(someStringArray, "The String to find.", String::compareTo);
Run Code Online (Sandbox Code Playgroud)

你也可以用

Arrays.binarySearch(someStringArray, "The String to find.", (a,b) -> a.compareTo(b));
Run Code Online (Sandbox Code Playgroud)

但即使在lambdas之前,总会有匿名课程:

Arrays.binarySearch(
                someStringArray,
                "The String to find.",
                new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                        return o1.compareTo(o2);
                    }
                });
Run Code Online (Sandbox Code Playgroud)


Mik*_*kis 6

此外,如果你想要不区分大小写的比较,在Java的最新版本中,String类包含一个类型的public static final字段,正如我最近发现的那样.所以,你可以使用完成你的工作.CASE_INSENSITIVE_ORDERComparator<String>String.CASE_INSENSITIVE_ORDER


bru*_*sto 6

好的,这是几年后但是使用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()
Run Code Online (Sandbox Code Playgroud)

返回一个比较器,它按自然顺序比较Comparable对象.返回的比较器是可序列化的,并在比较null时抛出NullPointerException.

  • 始终欢迎指向潜在答案的链接,但请在此处添加最重要的部分,以防链接被删除。 (2认同)