将 TreeSet<Integer> 与允许重复的比较器一起使用会产生什么影响

What would be the impact of using a TreeSet<Integer> with a comparator that allows duplicates

问题(java 集合中没有重复项的二叉树)。

我需要一个有重复项的二叉树,我需要 O(Log(n)) 复杂度的搜索和插入,同时保持顺序(所以我不能使用哈希表),java 不没有实现二叉树并允许重复的集合,同时保留所有二叉树操作。

我们可以使用 TreeSet 来做这个吗?

我正在尝试调整 TreeSet 并通过传递一个永远不会 returns 0 的比较器来允许重复项。我知道这不再是一个集合,但没关系,我需要重复项。

示例

TreeSet<Integer> binaryTreeWithDuplicates = new TreeSet<Integer>((x, y) -> x>y?1:-1);

这样的实施和使用会产生不良副作用吗?
因为我们明显违反了comparator api中的规则,比如符号规则。

contains 永远不会 return true.

集合中可能有任意重复项,但无法识别或删除它们。 (remove 永远行不通。)

我建议改用 TreeMultiset

意见:

一方面,您的 Set 不再是 Set。由于这超出了规范,因此实施没有义务始终如一地做任何事情。什么事都有可能发生。

请注意,由于您不能说 2 == 2,因此您必须同时拥有 2 > 2 和 2 < 2。这似乎不会以愉快的方式结束。

要发现这种滥用会发生什么,唯一的方法就是尝试一下。也许它会全部工作并允许重复条目。但这并不能保证它会在下一个错误修复中继续发生。

如果我需要这样的东西(虽然我不明白你的用例),我要么构建一个特殊用途的 class,要么尝试使用像一组列表这样的东西数字。