我想通過String.CompareTo比較器對字符串的靜態數組進行排序和二分搜索。Java get String CompareTo作爲比較對象
問題是,排序和二進制搜索都需要傳遞一個Comparator對象 - 那麼如何傳入內置的字符串比較器呢?
我想通過String.CompareTo比較器對字符串的靜態數組進行排序和二分搜索。Java get String CompareTo作爲比較對象
問題是,排序和二進制搜索都需要傳遞一個Comparator對象 - 那麼如何傳入內置的字符串比較器呢?
Arrays
類的版本爲sort()
和binarySearch()
,其中不需要Comparator.
例如,您可以使用the version of Arrays.sort()
which just takes an array of objects。這些方法調用數組中對象的compareTo()
方法。
您可以編寫自己的比較
public class ExampleComparator implements Comparator<String> {
public int compare(String obj1, String obj2) {
if (obj1 == null) {
return -1;
}
if (obj2 == null) {
return 1;
}
if (obj1.equals(obj2)) {
return 0;
}
return obj1.compareTo(obj2);
}
}
如果你發現yourslef需要一個Comparator
,你已經在使用Guava
,您可以使用Ordering.natural()
。
這是任何一種Comparable
對象的通用Comparator
,不只是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();
對不起,我誤讀了標題。我讀過包java.util! – Sharcoux 2016-07-12 15:09:52
@Sharcoux我明白了! Ç - := – 2016-07-12 16:27:48
可能是很好的下面的代碼添加到類: 公共靜態
另外,如果你想區分大小寫的比較,在最近版本的Java中,String
類包含public static final
字段,稱爲CASE_INSENSITIVE_ORDER
,它的類型爲Comparator<String>
,正如我剛剛發現的那樣。所以,你可以使用String.CASE_INSENSITIVE_ORDER
完成你的工作。
這是正確的答案。 – tallseth 2015-03-20 20:31:36
@tallseth這是正確的答案** only **如果您對不區分大小寫的搜索感興趣,**和**您正在使用最新版本的java。如果您需要的是區分大小寫的搜索,或者如果您遇到一些舊版本的java,那麼這不是您正確的答案。 – 2015-07-15 11:45:30
同樣,只要對象的類型可比,就不需要比較器Arrays.binarySearch(Object[] a, Object key)
,但對於lambda表達式來說,現在更容易。
只需更換與方法參考比較:String::compareTo
如:
Arrays.binarySearch(someStringArray, "The String to find.", String::compareTo);
你也可以使用
Arrays.binarySearch(someStringArray, "The String to find.", (a,b) -> a.compareTo(b));
但即使lambda表達式之前,總是有一些匿名類:
Arrays.binarySearch(
someStringArray,
"The String to find.",
new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
我們可以使用String.CASE_INSENSITIVE_ORDER比較器來比較大小寫不敏感的字符串。
Arrays.binarySearch(someStringArray, "The String to find.",String.CASE_INSENSITIVE_ORDER);
解決方案基於Java的java.util.Comparator.comparing(...) 8:
Comparator<String> c = Comparator.comparing(String::toString);
或
Comparator<String> c = Comparator.comparing((String x) -> x);
或Comparator.comparing(Function.identity()) – ailveen 2017-12-15 13:24:46
關於Nambari的answer出現了一個錯誤。如果您在使用雙等號==程序將永遠不會達到比較方法,除非有人會用新關鍵字來創建String對象是不是最好的做法比較值。這可能是一個更好的解決方案:
public int compare(String o1, String o2) {
if (o1 == null && o2 == null){return 0;}
if (o1 == null) { return -1;}
if (o2 == null) { return 1;}
return o1.compareTo(o2);
}
P.S.感謝您的評論;)
你應該解釋一下答案。 http://stackoverflow.com/help/how-to-answer – 2016-06-14 14:58:19
儘管此代碼可能會回答此問題,但提供 有關_why_和/或_how_的其他上下文,它將回答 該問題將顯着提高其長期值 的值。請[編輯]你的答案,添加一些解釋。 – 2016-06-14 15:13:51
這與Nambari的[答案](http://stackoverflow.com/a/11804763/369450)有什麼不同? – cpburnz 2016-06-14 18:55:05
確定這是幾年過去了,但與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。
對潛在答案的鏈接總是受歡迎的,但請在這裏添加最重要的部分以防鏈接被刪除。 – 2016-08-13 19:11:12
+1對於執行器比較器 – 2012-08-04 00:11:49
「比較器」是一個通用類型,所以'ExampleComparator'應該實現'Comparator'來避免警告。 –
theisenp
2013-05-14 20:41:28
對於字符串比較器,請在比較它們之前記住小寫字母(或大寫字母)字符串,否則您應該獲得此順序。A-Za-z – 2014-02-19 12:00:56