2009-11-07 13 views
7

Cóż, testowałem TreeMap, ale nie uwzględnia ono IgnoreCase przy porównywaniu ciągów. Muszę zamówić leksykograficzny i ignorujący przypadek. Czy jest jakiś inny sposób?Posortuj mapę <String, Object> klawiszami z IgnoreCase?

Dzięki, że działa (TreeMap (Komparator c)). Jednak mam inne pytanie:

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 

Jak mogę uniwersalizować komparatora do pracy z różnymi obiektami? zakładając, że wszystkie mają metodę getId().

Dzięki Martin

+7

Martin, to nie jest dobry pomysł, aby całkowicie zmienić pytanie. Następny użytkownik z uprawnieniami do tego (być może Ty) powinien przywrócić go do poprzedniego stanu. Po prostu zadaj nowe pytanie! –

+1

+1, Zgoda, kiedy ktoś udzieli ci odpowiedzi na twoje pytanie, powinieneś zaakceptować odpowiedź i przejść do nowego pytania, jeśli się pojawi. – camickr

+0

Wycofałem to z powrotem. – finnw

Odpowiedz

34

chcesz użyć Comparator w TreeMap constructor. W szczególności spójrz na String.CASE_INSENSITIVE_ORDER.

TreeMap map = new TreeMap(String.CASE_INSENSITIVE_ORDER); 

Korzystanie Collator lub zwyczaj Comparator może działać lepiej dla Ciebie w innym niż angielski lokum lub jeśli potrzebujesz bardziej złożonego zamówieniu.

+2

+1 dla linku do 'String.CASE_INSENSITIVE_ORDER'. – tangens

+0

Pamiętaj - jeśli jesteś angielskim programistą i masz kontrolę nad kluczami, których * nie potrzebujesz * musisz się martwić o ustawienia narodowe, ponieważ porównania nie są wykonywane na wartościach, są one wykonywane na klawisze ;-) –

1

dostarczyć komparatora, który porównuje ciągi przypadek ignorowane.

TreeMap (Komparator c)

0

Jeśli miał listę, powiedziałbym spróbować Collections.sort() z komparatora. Być może trzeba będzie przetoczyć własny Komparator, który używa String.equalsIgnoreCase() zamiast equals().

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

Ale byłem na dobrej drodze. Wypróbuj konstruktor TreeMap, który ma komparator:

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

Najlepszym sposobem byłoby użycie Collator. Collator jest klasą wbudowaną, która implementuje również Comparable, a zatem możesz go użyć do swojej TreeMap.

Za pomocą kompresora można również kontrolować siłę porównania, na przykład, jeśli chcesz być również niewrażliwy na nacisk.

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

Tak, należy użyć konstruktora TreeMap, który pobiera komparator. Utwórz komparator, który używa porównaniaCoIgnoreCase.

0

Podejrzewam, że powinieneś zbudować swój TreeMap z niestandardowym komparatorem.

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

Jak mogę uniwersalizować komparator do pracy z różnymi obiektami? zakładając, że wszystkie mają metodę getId().

Powinieneś być w stanie użyć BeanComparator.

+0

Zaleciłem, aby pytanie zostało przywrócone do pierwotnego pytania i zamiast tego zostało dodane nowe pytanie; jeśli tak się stanie, ta odpowiedź również powinna zostać usunięta. –

Powiązane problemy