按字典顺序比较两个可能为空的 Java 字符串

Compare two possibly null Java strings lexicographically

是否有 JDK 方法或 Comparator 可以比较两个字符串 AB 字典顺序 AB(或两者,或两者都不是)可能是 null?

我不太关心 null 值在排序中是排在第一位还是最后。

请注意,我不是在寻找 Objects#equals(Object a, Object b)。我正在寻找具有以下原型的 JDK 方法:

public int compare(String a, String b) ...

或者,JDK class

public class StringComparatorWithNulls implements Comparator<String> {
    @Override
    public int compareTo(String a, String b) {
        if (null == a) {
            return null == b ? 0 : -1;
        } else if (null == b) {
            return 1;
        } else {
            return a.compareTo(b);
        }
    }
}

如果 JDK 中没有任何东西可以做到这一点,那么广泛使用的开源库中的东西也可以。

您可能正在寻找来自 common-lang3 的 StringUtils 或 ObjectUtils:

https://commons.apache.org/proper/commons-lang/

public static boolean equals(CharSequence cs1,CharSequence cs2)

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#equals(java.lang.CharSequence,%20java.lang.CharSequence)

否则,如果要比较,与:

http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/ObjectUtils.html#compare%28T,%20T%29

字符串 compareTo 正是这样做的,您可以为将调用此 compareTo 函数的字符串添加空检查,以便它处理 null 值 -

String s1 = "Hello";
String s2 = "bye";
System.out.println(s1.compareTo(s2));
>> -26

你的条件看起来像 -

if(s1 != null && s1.compareTo(s2) > 0)

该方法的return是一个int,可以解释为:

  • returns < 0 那么调用该方法的String是字典序的 first(在字典中排在第一位)
  • returns == 0 那么两个字符串 在字典序上是等价的
  • returns > 0 然后参数 传递给 compareTo 方法的是字典顺序优先的。

Guava provides the very useful Ordering class (more info)。它具有流畅的界面,并且扩展了 Comparator,因此您可以在任何需要使用 Comparator.

的地方使用它
Comparator<String> nullSafeComparator = Ordering.<String>natural().nullsLast();