相关疑难解决方法(0)

java的UUID.randomUUID有多好?

我知道随机UUID在理论上具有非常非常非常低的碰撞概率,但我想知道,在实践中,Java 5 randomUUID()在没有碰撞方面有多好?有没有人有经验可以分享?

java uuid

300
推荐指数
8
解决办法
16万
查看次数

Java 对象上的任意比较器

假设我正在构建一个TreeSet对象,其顺序仅取决于一个值。

我不能做

TreeSet<Foo> tree = new TreeSet<>(Comparator.comparingInt(Foo::getX));
Run Code Online (Sandbox Code Playgroud)

因为如果我添加两个Foo具有相同对象的不同对象x,那么一个将替换另一个(即,如果我这样做,tree.add(foo1)并且,将代替)。tree.add(foo2)tree.size()12

我可以比较 的每个字段Foo,但我希望 的两个实例Foo被视为不同,即使每个字段都相同。

一种“几乎有效”的解决方案是

TreeSet<Foo> tree = new TreeSet<>(Comparator.comparingInt(Foo::getX).thenComparing(Foo::hashCode));
Run Code Online (Sandbox Code Playgroud)

但当存在哈希冲突时,这会失败。

总之,我正在寻找类似的东西

TreeSet<Foo> tree = new TreeSet<>(Comparator.comparingInt(Foo::getX).thenComparing(Foo::getInternalAddress));
Run Code Online (Sandbox Code Playgroud)

但我们当然无法使用这样的方法。

解决方法

我知道有解决方法:

  • 如果我不关心对象本身,而只关心树中有多少个,我可以使用多重集TreeMap<Foo, Integer>(并比较所有字段)来给出Foo特定对象的数量x
  • 如果我确实关心对象(我正在进行引用相等性检查),我可以使用不同的多重集TreeMap<Foo, List<Foo>>(或TreeMap<Integer, List<Foo>>键为x)。但如果“重复”的 foo 很少,那么所有单例列表都会浪费空间。

因此,虽然我知道 a 有解决方法TreeMap,但我仍然想知道是否有一种方法可以仅使用 a 来做到这一点TreeSet

java comparator treeset

3
推荐指数
1
解决办法
233
查看次数

标签 统计

java ×2

comparator ×1

treeset ×1

uuid ×1