代码之家  ›  专栏  ›  技术社区  ›  unj2

用自定义比较器在Java中创建SoRead映射

  •  21
  • unj2  · 技术社区  · 15 年前

    我想创建一个 TreeMap 在Java中具有自定义排序顺序。作为字符串的已排序键需要根据第二个字符进行排序。这些值也是字符串。

    示例地图:

    Za,FOO
    Ab,Bar
    
    2 回复  |  直到 15 年前
        1
  •  32
  •   Community CDub    8 年前

    您可以使用这样的自定义比较器:

        Comparator<String> secondCharComparator = new Comparator<String>() {
            @Override public int compare(String s1, String s2) {
                return s1.substring(1, 2).compareTo(s2.substring(1, 2));
            }           
        };
    

    样品:

        SortedMap<String,String> map =
            new TreeMap<String,String>(secondCharComparator);
        map.put("Za", "FOO");
        map.put("Ab", "BAR");
        map.put("00", "ZERO");
        System.out.println(map); // prints "{00=ZERO, Za=FOO, Ab=BAR}"
    

    注意,这只是假设 String 在索引1处有一个字符。它抛出 StringIndexOutOfBoundsException 如果没有。


    或者,您也可以使用此比较:

    return s1.charAt(1) - s2.charAt(1);
    

    这个减法“诀窍”一般都被打破了,但在这里它可以很好地工作,因为减法是2 char 不会溢出 int .

    这个 substring compareTo 不过,上面的解决方案更具可读性。

    另请参见:

        2
  •  0
  •   CheesePls    15 年前

    假设您不是指哈希函数或排序中的哈希…

    通过为字符串创建一个“wrapper”类并重写compareto方法,可以很容易地完成此任务。