2014-10-30 25 views
9

Có rất nhiều ví dụ về lý do tại sao và khi nào java.lang.String.equalsIgnoreCase sẽ không thành công do sử dụng ngôn ngữ không chính xác.Giải pháp thay thế chính xác cho equalsIgnoreCase của Java là gì?

Nhưng tôi không tìm thấy bất kỳ ví dụ nào về cách chính xác. Không giống như java.lang.String.toUpperCase, không có phiên bản nào có tham số miền địa phương. Việc chuyển đổi cả hai chuỗi thành chữ hoa hoặc chữ thường dường như lãng phí. Đặc biệt là khi bạn đang làm việc trên một ứng dụng làm rất nhiều so sánh.

Cách chính xác để so sánh chuỗi trường hợp bỏ qua là gì, hãy xem xét cả vị trí và hiệu suất?

+1

Có thể bằng cách sử dụng ['Collator'] (http://docs.oracle.com/javase/8/docs/api/java/text/Collator.html)? – fge

+2

Bạn có nhớ chỉnh sửa câu hỏi của mình với các ví dụ về kết quả sai của '.equalsIgnoreCase()' không? Tôi khá tò mò ... – fge

+0

@fge Thổ Nhĩ Kỳ «i» và tiếng Đức «ß» dường như là những thất bại được trích dẫn nhiều nhất. Nhưng bạn nói đúng, tôi thêm một số ví dụ sau. – Martin

Trả lời

1

Theo this page, bạn có thể sử dụng để làm collator trường hợp bình đẳng không nhạy cảm như sau:

//retrieve the runtime user's locale 
Locale locale = new Locale(getUserLocale()); 

//pass the user's locale as an argument 
Collator myCollator = Collator.getInstance(locale); 

//set collator to Ignore case but not accents 
//(default is Collator.TERTIARY, which is 
//case sensitive) 
myCollator.setStrength(Collator.SECONDARY); 

int i = myCollator.compare(stringA,stringB); 

(Sao chép từ các trang web trên ...)

Rõ ràng, trong bối cảnh khác bạn có thể chọn địa phương khác nhau.


Đối với @fge - Báo cáo lỗi Oracle này đưa ra ví dụ về loại điều xảy ra.

+0

Cảm ơn ví dụ! Và để dành thời gian để thực sự tìm thấy một số mã ... – fge

0

Một thay thế có thể có thể lạm dụng Regex. Điều này khá hiệu quả chuyên sâu với việc thay đổi động chuỗi, nhưng nếu bạn đang so sánh với hằng nó thể là một thay thế:

Matcher matcher = Pattern.compile("^" + myOtherString + "$", 
    Pattern.CASE_INSENSITIVE | Pattern.LITERAL | Pattern.UNICODE_CASE).matcher(); 
if (matcher.matches(myString)) { 
    // ... 
} 

này neo chuỗi bạn muốn so sánh với, quy định cụ thể Unicode-aware case-insensitive phù hợp với chuỗi chữ.

+0

Tôi dự đoán rằng sẽ có cùng một vấn đề như sử dụng 'String.equalsIgnoreCase'. Sự so sánh cần phải được nhận biết về miền địa phương, không chỉ là nhận thức Unicode. ('String.equalsIgnoreCase' cũng là Unicode nhận biết ... theo' Chuỗi' javadocs.) –

+0

@StephenC phần thú vị về điều này, rằng exaple được đưa ra trong câu trả lời của bạn sẽ không có cùng một vấn đề. Lỗi ß -> SS xuất phát từ thực tế là không có chữ hoa nào tương đương với ß. chỉ ß sẽ khớp với ß và ss sẽ ** không ** khớp với ß (vì nó xảy ra trong equalsIgnoreCase();) – Vogel612

Các vấn đề liên quan