2012-08-03 99 views

回答

27

您可以編寫自己的比較

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); 
    } 
} 
+0

+1對於執行器比較器 – 2012-08-04 00:11:49

+8

「比較器」是一個通用類型,所以'ExampleComparator'應該實現'Comparator '來避免警告。 – theisenp 2013-05-14 20:41:28

+0

對於字符串比較器,請在比較它們之前記住小寫字母(或大寫字母)字符串,否則您應該獲得此順序。A-Za-z – 2014-02-19 12:00:56

10

這是任何一種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(); 
+1

對不起,我誤讀了標題。我讀過包java.util! – Sharcoux 2016-07-12 15:09:52

+0

@Sharcoux我明白了! Ç - := – 2016-07-12 16:27:48

+0

可能是很好的下面的代碼添加到類: 公共靜態>比較 getReversedInstance() { 返回Collections.reverseOrder((比較)的getInstance()); } – 2017-07-12 14:57:29

6

另外,如果你想區分大小寫的比較,在最近版本的Java中,String類包含public static final字段,稱爲CASE_INSENSITIVE_ORDER,它的類型爲Comparator<String>,正如我剛剛發現的那樣。所以,你可以使用String.CASE_INSENSITIVE_ORDER完成你的工作。

+0

這是正確的答案。 – tallseth 2015-03-20 20:31:36

+0

@tallseth這是正確的答案** only **如果您對不區分大小寫的搜索感興趣,**和**您正在使用最新版本的java。如果您需要的是區分大小寫的搜索,或者如果您遇到一些舊版本的java,那麼這不是您正確的答案。 – 2015-07-15 11:45:30

9

同樣,只要對象的類型可比,就不需要比較器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); 
        } 
       }); 
2

我們可以使用String.CASE_INSENSITIVE_ORDER比較器來比較大小寫不敏感的字符串。

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

解決方案基於Java的java.util.Comparator.comparing(...) 8:

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

Comparator<String> c = Comparator.comparing((String x) -> x); 
+0

或Comparator.comparing(Function.identity()) – ailveen 2017-12-15 13:24:46

-1

關於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.感謝您的評論;)

+1

你應該解釋一下答案。 http://stackoverflow.com/help/how-to-answer – 2016-06-14 14:58:19

+1

儘管此代碼可能會回答此問題,但提供 有關_why_和/或_how_的其他上下文,它將回答 該問題將顯着提高其長期值 的值。請[編輯]你的答案,添加一些解釋。 – 2016-06-14 15:13:51

+1

這與Nambari的[答案](http://stackoverflow.com/a/11804763/369450)有什麼不同? – cpburnz 2016-06-14 18:55:05

0

要與String.CASE_INSENSITIVE_ORDER概括麥克Nakis的很好的答案,你也可以使用:

Collator.getInstance(); 

Collator

4

確定這是幾年過去了,但與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。

+0

對潛在答案的鏈接總是受歡迎的,但請在這裏添加最重要的部分以防鏈接被刪除。 – 2016-08-13 19:11:12