2009-11-07 40 views
7

Vâng, tôi đã thử nghiệm TreeMap nhưng nó không đưa vào tài khoản IgnoreCase trên so sánh chuỗi. Tôi cần phải đặt hàng từ điển và bỏ qua trường hợp. Còn cách nào khác không?Sắp xếp bản đồ <String, Object> bằng các khóa bằng IgnoreCase?

Cảm ơn, công trình đó (TreeMap (Comparator c)). Tuy nhiên, tôi có một câu hỏi khác:

public final Comparator<Object> STR_IGN_CASE_COMP = new Comparator<Object>() { 

    public int compare(Object h1, Object h2) { 
      String s1 = h1.getId(); 
      String s2 = h2.getId(); 
      return s1.compareToIgnoreCase(s2); 
    } 
}; //STR_IGN_CASE_COMP 

Tôi có thể phổ dụng bộ so sánh để làm việc với các đối tượng khác nhau như thế nào? giả sử tất cả đều có phương thức getId().

Cảm ơn, Martin

+7

Martin, bạn không nên thay đổi hoàn toàn câu hỏi. Người dùng tiếp theo với đặc quyền để làm như vậy (có lẽ bạn) nên hoàn nguyên nó về trạng thái trước đó của nó. Chỉ cần đăng câu hỏi mới! –

+1

+1, Đồng ý, khi ai đó cung cấp cho bạn câu trả lời cho câu hỏi của bạn, bạn nên chấp nhận câu trả lời và chuyển sang câu hỏi mới nếu câu hỏi nảy sinh. – camickr

+0

Tôi đã quay lại. – finnw

Trả lời

34

Bạn muốn sử dụng Comparator trong TreeMap constructor. Đặc biệt, hãy xem String.CASE_INSENSITIVE_ORDER.

TreeMap map = new TreeMap(String.CASE_INSENSITIVE_ORDER); 

Sử dụng Collator hoặc tùy chỉnh Comparator có thể làm việc tốt hơn cho bạn trong một miền địa phương không phải tiếng Anh hoặc nếu bạn cần đặt hàng phức tạp hơn.

+2

+1 cho liên kết đến 'Chuỗi.CASE_INSENSITIVE_ORDER'. – tangens

+0

Hãy nhớ rằng - nếu bạn là một lập trình viên tiếng Anh và bạn đang kiểm soát các phím bạn * không * cần phải lo lắng về ngôn ngữ, vì các so sánh không được thực hiện trên các giá trị, chúng đang được thực hiện trên phím ;-) –

1

Cung cấp cho nó một Comparator so sánh chuỗi trường hợp bị bỏ qua.

Bản đồ cây (Máy so sánh c)

0

Nếu bạn có danh sách, tôi có thể thử dùng Collections.sort() với Bộ so sánh. Bạn có thể phải cuộn Comparator của riêng bạn sử dụng String.equalsIgnoreCase() thay vì bằng().

public static <T> void sort(List<T> list, 
         Comparator<? super T> c) 

Nhưng tôi đã đi đúng hướng. Hãy thử hàm tạo TreeMap lấy Comparator:

public TreeMap(Comparator<? super K> comparator) 
6

Cách tốt nhất là sử dụng Collator. Collator là một lớp được xây dựng sẵn, nó cũng thực hiện Comparable, và do đó bạn có thể sử dụng nó cho TreeMap của bạn.

Với trình thu thập, bạn cũng có thể kiểm soát độ mạnh của phép so sánh, ví dụ, nếu bạn muốn không nhạy cảm với giọng.

Collator stringCollator = Collator.getInstance(); 
stringCollator.setStrength(Collator.PRIMARY); 
new TreeMap<String, String>(stringCollator) 
0

Có, điều bạn muốn là sử dụng hàm tạo TreeMap để so sánh. So sánh sử dụng compareToIgnoreCase.

0

Tôi nghi ngờ bạn nên xây dựng TreeMap của mình bằng bộ so sánh tùy chỉnh.

import java.text.Collator; 
import java.util.Comparator; 

class IgnoreCaseComp implements Comparator<String> { 
    Collator col; 

    IgnoreCaseComp() { 
    col = Collator.getInstance(); 

    col.setStrength(Collator.PRIMARY); 
    } 

    public int compare(String strA, String strB) { 
    return col.compare(strA, strB); 
    } 
} 
0

Làm cách nào để phổ biến bộ so sánh để hoạt động với các đối tượng khác nhau? giả sử tất cả đều có phương thức getId().

Bạn sẽ có thể sử dụng BeanComparator.

+0

Tôi đã đề xuất câu hỏi được hoàn nguyên về câu hỏi gốc và câu hỏi mới được đăng thay thế; nếu và khi điều đó xảy ra, câu trả lời này có lẽ cũng nên được loại bỏ. –

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