scala - 树图中缺少键值对
问题描述
我正在尝试使用 TreeMap 解决编程问题,这导致我发布了这个问题。
我定义了一个以 (Int,Int) 作为我的键和 String 作为值的 treeMap,根据元组的第一个元素定义了 treeMap 排序。而且我插入了两个元素不同的Key,但是最终的treeMap只包含一个元素。这是treeMap的定义行为吗
Scala 代码:(版本:2.12.3)
val a = scala.collection.mutable.TreeMap[(Int, Int), String]()(Ordering.by(x => x._1))
a.put((9, 21), "value-1")
a.put((9, 10), "value-2")
println(a.size) // 1
我在 java 中尝试了相同的实现,但它报告 Map Size 为 2 这是我的 java 代码:
有人可以建议我是否缺少某些东西
import java.util.Comparator;
import java.util.TreeMap;
public class JavaTreeMapTest {
public static void main(String[] args) {
class Tuple {
Integer a;
Integer b;
public Tuple(Integer a, Integer b) {
this.a = a;
this.b = b;
}
}
Comparator<Tuple> testComparator = new Comparator<Tuple>() {
@Override
public int compare(Tuple arg0, Tuple arg1) {
if (arg0.a > arg1.a) {
return arg0.a;
} else
return arg1.a;
}
};
TreeMap<Tuple, String> tm = new TreeMap<Tuple, String>(testComparator);
tm.put(new Tuple(100, 100), "value-1");
tm.put(new Tuple(100, 101), "value-2");
System.out.println(tm.size()); //2
}
}
解决方案
问题在于您的订购。如果你像这样使用它:Ordering.by(x => x._1)
,TreeMap 将只考虑第一个元素来计算相等性。因此,两者(9, 21)
和(9, 21)
都将被视为相等。
一种解决方案是先按第一个元素排序,然后按第二个元素排序。你可以通过返回一个元组来做到这一点:
Ordering.by(x => (x._1, x._2))
。
但由于您已经在使用元组,您可以将其简化为:
Ordering.by(x => x)
或者
Ordering.by(identity)
或者
您可以省略它,因为按身份排序是默认设置。
总结一下:
val a = scala.collection.mutable.TreeMap[(Int, Int), String]()
a.put((9, 21), "value-1")
a.put((9, 10), "value-2")
println(a.size) // 2
推荐阅读
- javascript - 如果其他情况下,如何使用 html/javascript 复选框函数链接 python
- php - ajax 函数 .done 和 .fail,无值返回
- python - 将 SQL 表命名为与 python to_sql() 函数中的 df 名称相同
- javascript - 三.js 创建镜像 VS。钢材对材料的影响?
- c++ - std::span 迭代器可以比创建它们的 span 对象更长寿吗?
- r - 将周数更改为已过去的周数,而不是一年中的周数
- python - 使用函数的 Python HangMan 游戏
- elasticsearch - Elasticsearch COUNT() 文本字段
- powershell - 我可以使用正则表达式通过 CTRL+R 反向搜索来搜索 PowerShell 命令历史记录吗?
- shopify - Shopify 订阅,但直到第二个计费周期才开始