使用自定义比较器在 Java 中创建 SortedMap

发布于 2024-08-30 14:19:49 字数 126 浏览 1 评论 0原文

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

示例地图:

Za,FOO
Ab,Bar

I want to create a TreeMap in Java with a custom sort order. The sorted keys which are string need to be sorted according to the second character. The values are also string.

Sample map:

Za,FOO
Ab,Bar

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

将军与妓 2024-09-06 14:19:49

您可以使用如下所示的自定义比较器:

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

这个减法“技巧”通常被破坏,但在这里它工作正常,因为两个 char 的减法不会溢出 int

不过,上面的 substringcompareTo 解决方案更具可读性。

另请参阅:

You can use a custom comparator like this:

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

Sample:

    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}"

Note that this simply assumes that the String has a character at index 1. It throws StringIndexOutOfBoundsException if it doesn't.


Alternatively, you can also use this comparison:

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

This subtraction "trick" is broken in general, but it works fine here because the subtraction of two char will not overflow an int.

The substring andcompareTo solution above is more readable, though.

See also:

爱的那么颓废 2024-09-06 14:19:49

假设您不是指散列函数或排序中的散列...

您可以通过为 String 创建一个“包装器”类并覆盖 CompareTo 方法来轻松完成此操作

Assuming you don't mean Hash as in hash function or the sort...

You could easily accomplish this by creating a "wrapper" class for String and overriding the compareTo method

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文