10

好吧,我测试了 TreeMap,但它没有考虑字符串比较的 IgnoreCase。我需要按字典顺序排序并忽略大小写。还有其他方法吗?

谢谢,那行得通(TreeMap(比较器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

如何使比较器通用化以处理不同的对象?假设所有人都有 getId() 方法。

谢谢,马丁

4

7 回答 7

37

您想ComparatorTreeMap构造函数中使用 a 。特别是看String.CASE_INSENSITIVE_ORDER

TreeMap map = new TreeMap(String.CASE_INSENSITIVE_ORDER);

在非英语语言环境中或者如果您需要更复杂的订购,使用Collator或自定义可能更适合您。Comparator

于 2009-11-07T01:35:40.507 回答
8

最好的方法是使用 Collat​​or。整理器是一个内置类,它也实现了 Comparable,因此您可以将它用于您的 TreeMap。

使用整理器,您还可以控制比较的强度,例如,如果您也想对重音不敏感。

Collator stringCollator = Collator.getInstance();
stringCollator.setStrength(Collator.PRIMARY); 
new TreeMap<String, String>(stringCollator)
于 2009-11-07T01:34:44.967 回答
1

为它提供一个比较忽略大小写的字符串的比较器。

TreeMap(比较器 c)

于 2009-11-07T01:34:19.147 回答
1

如何使比较器通用化以处理不同的对象?假设所有人都有 getId() 方法。

您应该能够使用BeanComparator

于 2009-11-07T02:39:01.980 回答
0

如果你有一个列表,我会说尝试使用 Comparator 的 Collections.sort()。您可能必须推出自己的使用 String.equalsIgnoreCase() 而不是 equals() 的比较器。

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

但我走在正确的轨道上。尝试使用 Comparator 的 TreeMap 构造函数:

public TreeMap(Comparator<? super K> comparator)
于 2009-11-07T01:34:27.563 回答
0

是的,您想要的是使用带有 Comparator 的 TreeMap 构造函数。制作一个使用 compareToIgnoreCase 的比较器。

于 2009-11-07T01:34:53.317 回答
0

我怀疑您应该TreeMap使用自定义比较器构建您的。

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);
  }
}
于 2009-11-07T01:35:28.557 回答