2012-08-03 64 views

Trả lời

27

Bạn có thể viết so sánh của riêng bạn

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 để thực hiện Bộ so sánh –

+8

'Bộ so sánh' là loại chung, vì vậy' ExampleComparator' có lẽ nên thực hiện 'Comparator ' để tránh cảnh báo. – theisenp

+0

Để so sánh chuỗi, hãy nhớ đến chữ thường (hoặc chữ hoa) trước khi so sánh chúng nếu không bạn sẽ nhận được thứ tự này A-Za-z –

11

Nếu bạn tìm yourslef cần một Comparator, và bạn đã sử dụng Guava, bạn có thể sử dụng Ordering.natural().

10

Đây là một generic Comparator cho bất kỳ loại Comparable đối tượng, không chỉ 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); 
    } 
} 

Làm thế nào để sử dụng với String:

Comparator<String> stringComparator = DefaultComparator.getInstance(); 
+1

Xin lỗi, tôi đã đọc sai tiêu đề. Tôi đã đọc gói java.util! – Sharcoux

+0

@Sharcoux Tôi hiểu rồi! C -: = –

+0

thể được tốt đẹp để thêm đoạn mã sau vào lớp rằng: public static > sánh getReversedInstance() { trở Collections.reverseOrder ((Comparator ) getInstance()); } –

6

Ngoài ra, nếu bạn muốn so sánh case-insensitive, trong các phiên bản Java gần đây của lớp String có trường public static final được gọi là CASE_INSENSITIVE_ORDER thuộc loại Comparator<String>, như tôi vừa mới phát hiện ra. Vì vậy, bạn có thể hoàn thành công việc của mình bằng cách sử dụng String.CASE_INSENSITIVE_ORDER.

+0

Đây là câu trả lời đúng. – tallseth

+0

@tallseth đây là câu trả lời đúng ** chỉ ** nếu bạn quan tâm đến tìm kiếm phân biệt chữ hoa chữ thường, ** và ** bạn đang sử dụng phiên bản java gần đây. Nếu những gì bạn cần là tìm kiếm phân biệt chữ hoa chữ thường, hoặc nếu bạn đang mắc kẹt với một số phiên bản cũ của java, thì đây không phải là câu trả lời đúng cho bạn. –

9

Một lần nữa, không cần so sánh cho Arrays.binarySearch(Object[] a, Object key) miễn là các loại đối tượng có thể so sánh được, nhưng với các biểu thức lambda thì cách này dễ dàng hơn.

Đơn giản chỉ cần thay thế so sánh với các tài liệu tham khảo phương pháp: String::compareTo

Ví dụ:

Arrays.binarySearch(someStringArray, "The String to find.", String::compareTo); 

Bạn cũng có thể sử dụng

Arrays.binarySearch(someStringArray, "The String to find.", (a,b) -> a.compareTo(b)); 

nhưng ngay cả trước khi lambdas, luôn có lớp vô danh:

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

Chúng tôi có thể sử dụng trình so sánh String.CASE_INSENSITIVE_ORDER để so sánh các chuỗi theo thứ tự không phân biệt chữ hoa chữ thường.

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

Giải pháp cho Java 8 dựa trên java.util.Comparator.comparing(...):

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

hoặc

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

Hoặc Comparator.comparing (Function.identity()) – ailveen

-1

Về Nambari của answer đã có một sai lầm.Nếu bạn so sánh giá trị sử dụng đôi dấu bằng chương trình == sẽ không bao giờ đạt được phương pháp so sánh, trừ khi ai đó sẽ sử dụng mới từ khóa để tạo đối tượng String mà không phải là thực hành tốt nhất. Đây có thể là giải pháp tốt hơn một chút:

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. Cảm ơn ý kiến;)

+1

Bạn nên giải thích một chút câu trả lời. http://stackoverflow.com/help/how-to-answer –

+1

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung liên quan đến _why_ và/hoặc _how_ nó trả lời câu hỏi sẽ cải thiện đáng kể giá trị dài hạn của nó. Xin vui lòng [sửa] câu trả lời của bạn để thêm một số lời giải thích. –

+1

Điều này có hiệu quả như thế nào khác với [answer] của Nambari (http://stackoverflow.com/a/11804763/369450)? – cpburnz

0

Để khái quát những câu trả lời tốt của Mike Nakis với String.CASE_INSENSITIVE_ORDER, bạn cũng có thể sử dụng:

Collator.getInstance(); 

Xem Collator

4

Ok đây là một vài năm sau đó nhưng với java 8 bạn có thể sử dụng Comparator.naturalOrder():

http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#naturalOrder--

Từ javadoc:

static <T extends Comparable<? super T>> Comparator<T> naturalOrder() 

Trả về một bộ so sánh so sánh Các đối tượng có thể so sánh theo thứ tự tự nhiên. Bộ so sánh được trả về có thể tuần tự hóa và ném NullPointerException khi so sánh null.

+0

Liên kết đến các câu trả lời tiềm năng luôn được chào đón, nhưng vui lòng thêm các phần quan trọng nhất tại đây trong trường hợp liên kết bị xóa. –