如何按键名(不区分大小写)对Map<String, Object>进行排序?

10

我测试了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() 方法。

谢谢, Martin


7
Martin,完全改变问题不是一个好主意。下一个有权限这样做的用户(也许是你)应该将其恢复到先前的状态。只需发布一个新问题! - Kevin Bourrillion
1
+1,同意。当有人回答了你的问题时,你应该接受这个答案并继续提出新的问题(如果有的话)。 - camickr
1
似乎问题又被“滚动”了,该问题不再与任何答案匹配。 - Paul Wagland
7个回答

37

记住 - 如果你是一名英语程序员,并且你掌控着键,你就不需要担心本地化问题,因为比较并不是基于值进行的,而是基于键进行的 ;-) - Brad Parks

8

最好的方法是使用Collator。Collator是一个内置类,也实现了Comparable接口,因此您可以将其用于TreeMap。

使用Collator,您还可以控制比较的强度,例如,如果您希望不考虑重音。

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

1

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

TreeMap(Comparator c)


1
如何使比较器通用化以适用于不同的对象?假设它们都有 getId() 方法。
您可以使用 BeanComparator

我建议将问题恢复为原始问题,并发布一个新的问题;如果发生这种情况,这个答案也应该被删除。 - Kevin Bourrillion

0
如果你有一个列表,我会建议使用Collections.sort()和Comparator。你可能需要编写自己的Comparator,使用String.equalsIgnoreCase()而不是equals()。
public static <T> void sort(List<T> list,
                        Comparator<? super T> c)

但是我走在正确的轨道上。尝试使用带有比较器的TreeMap构造函数:

public TreeMap(Comparator<? super K> comparator)

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);
  }
}

0

是的,你需要使用带有比较器的TreeMap构造函数。创建一个使用compareToIgnoreCase的比较器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接