如何解决树图如何处理将键放在同一索引上的情况?
我尝试了以下代码:
public static void main (String[] args) throws java.lang.Exception
{
// sorting based on number of dots
Map<String,String> map =new TreeMap<>((o1,o2) -> {
int noOfDots1 = o1.length() - o1.replaceAll("\\.","").length() ;
int noOfDots2 = o2.length() - o2.replaceAll("\\.","").length() ;
return noOfDots1 - noOfDots2;
});
map.put("ty.r.r.r","a");
map.put("t.i.o","b");
map.put("i.o.y.y","c");
map.put("p.u.r.w.e","d");
map.put("j.k.i","e");
System.out.println(map);
}
但输出如下:
{t.i.o=e,ty.r.r.r=c,p.u.r.w.e=d}
为什么我们没有在输出中获得所有五个键?
编辑:
谢谢大家,我明白为什么我没有在输出中获取所有 5 个键,但我只是想知道按点的排序顺序获取所有键的最佳方法是什么。
我想到的一个想法是提取所有键,将它们存储在列表中并根据点数对该列表进行排序,然后使用相同的列表对地图重新排序?有没有更好的办法
解决方法
因为键中的点数是:
3
2
3
4
2
唯一计数为:2,3 and 4
put
中的 TreeMap
方法使用您指定的比较器来检查相等性。如果您的比较器在两个键上返回 0
,则认为它们相同。
对于您的数据,这意味着具有相同点数的所有字符串都被视为相同的键。
相关来源:https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/TreeMap.java#L795
,.replace(".","")
是绝对优越的(替换 also 替换所有出现的;它只是不使用正则表达式。您应该修复这部分代码)。
简单的解决方案是使用二级排序顺序。 t.i.o 和 j.k.y 应该如何相对排序?例如,如果您想按字母顺序排列:
Comparator<String> a = (o1,o2) ->
o1.length() - o1.replace(".","").length() -
(o2.length() - o2.replace(".","").length());
Comparator<String> b = Comparator.naturalOrder();
var map = new TreeMap<String,String>(a.thenComparing(b));
请注意使用 'thenComparing' 来建立第二个排序顺序,在第一个排序顺序会导致相等时使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。