繁体   English   中英

排序地图 <String, Object> 通过IgnoreCase键?

[英]Sort Map<String, Object> by keys with IgnoreCase?

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

谢谢,这是有效的(TreeMap(Comparator 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()方法。

谢谢,马丁

您想在TreeMap构造函数中使用Comparator 特别是,请查看String.CASE_INSENSITIVE_ORDER

TreeMap map = new TreeMap(String.CASE_INSENSITIVE_ORDER);

使用Collator或自定义Comparator可能会在非英语语言环境中更好地为您工作,或者如果您需要更复杂的排序。

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

使用collat​​or,您还可以控制比较的强度,例如,如果您想要对重音不敏感。

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

为它提供一个Comparator,用于比较被忽略的字符串。

TreeMap(比较器c)

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

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

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

public TreeMap(Comparator<? super K> comparator)

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

我怀疑你应该使用自定义比较器构建你的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);
  }
}

如何将比较器广泛化以适应不同的对象? 假设所有人都有getId()方法。

您应该能够使用BeanComparator

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM