使用命令CASE_INSENSITIVE_ORDER按键对TreeMap进行排序

时间:2014-06-05 10:51:36

标签: java

如何根据密钥对TreeMap<String, String> CASE_INSENSITIVE_ORDER进行排序。

目前,默认情况下,它的排序方式如下:

  

A B C D a b c d

我希望它像:

  

a A b B c C d D

6 个答案:

答案 0 :(得分:4)

NULL - 比较器未按问题排序。要求的结果是像

这样的订单
  

a,A,b,B ......

相反,它处理&#34; a&#34;和&#34; A&#34; as&#34; equal&#34;,表示带有键的条目&#34; a&#34;将使用键&#34; A&#34;覆盖条目。在排序地图中。结果更像是&#34; a,B&#34;,取决于最后添加到地图中的内容。

实现这种行为的一种方法是使用这样的自定义比较器:    

String.CASE_INSENSITIVE_ORDER

答案 1 :(得分:1)

致电String#CASE_INSENSITIVE_ORDERTreeMap构造函数,

Map<String, String> tree = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

答案 2 :(得分:1)

您是否只是尝试过:

new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);

答案 3 :(得分:1)

您可以将不区分大小写的顺序比较器作为TreeMap constructors之一的参数传递:

TreeMap<String, String> treemap = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);

答案 4 :(得分:0)

在TreeMap构造函数中使用Comparator。并String.CASE_INSENSITIVE_ORDER

答案 5 :(得分:0)

接受的答案是错误的-'a'和'A'是忽略大小写的相同键。这里有一些玩具代码可以证明这一点,并提供回答问题的替代方案的草图。

import java.util.Comparator;
import java.util.TreeMap;

public class TreeMapComparatorTest {
public static void main(String[] args) {
    TreeMap<String, Integer> caseInsensitive = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);
    caseInsensitive.put("a", 97);
    caseInsensitive.put("A", 65);

    // prints [a]
    System.out.println(caseInsensitive.keySet());

    TreeMap<String, Integer> customComparator = new TreeMap<String, Integer>(new Comparator<String>(){

        @Override
        public int compare(String o1, String o2) {

            // assuming only single letters for a smaller example...
            Character c1 = o1.charAt(0);
            Character c2 = o2.charAt(0);
            Character upper1 = Character.toUpperCase(c1);
            Character upper2 = Character.toUpperCase(c2);
            if(c1.compareTo(c2) == 0){

                // exactly the same char
                return 0;
            }else if (upper1.compareTo(upper2) == 0){

                // return lowercase first for same upper chars
                return -c1.compareTo(c2);
            }else{

                // order alphabetically
                return upper1.compareTo(upper2);
            }
        }
    });
    customComparator.put("a", 97);
    customComparator.put("A", 65);
    customComparator.put("b", 98);
    customComparator.put("B", 66);

    // prints [a, A, b, B]
    System.out.println(customComparator.keySet());
}

}