【问题标题】:What would be the impact of using a TreeSet<Integer> with a comparator that allows duplicates将 TreeSet<Integer> 与允许重复的比较器一起使用会有什么影响
【发布时间】:2022-01-10 15:41:03
【问题描述】:

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

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

我们可以使用 TreeSet 来做到这一点吗?

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

例子

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

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

【问题讨论】:

  • Set 不能有重复项,因此您不需要 Set。我建议使用列表,并始终使用Collections.binarySearch 对列表进行排序,以确定每个新元素的插入点。 (您也可以频繁地对整个 List 进行排序,但这样做效果会很差。)
  • @Progman 我修改了问题,指定了 X,然后讨论了可能的 Y,同时询问了这样的 Y 的副作用。(有关 xy 问题的更多信息xyproblem.info .thanks btw that内容丰富)

标签: java binary-tree comparator treeset


【解决方案1】:

contains 永远不会返回 true

您可能在集合中有任意重复项,并且无法识别或删除它们。 (remove 永远不会工作。)

【讨论】:

  • 是的,这是一个非常不受欢迎的副作用,我的目标是创建一个带有 dups 的二叉树,但保留包含、删除...似乎无法使用此类,他们使用 compareTo 来做所有的操作,我们不能覆盖它。
【解决方案2】:

我建议改用TreeMultiset

【讨论】:

  • 感谢您的建议,我试图坚持使用java collection api。但这似乎不可能,我必须自己实现它或使用第三方库。
【解决方案3】:

意见:

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

请注意,由于您不能说 2 == 2,因此您必须在 2 2。这似乎不会愉快地结束。

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

如果我需要这样的东西(虽然我不理解你的用例),我会构建一个特殊用途的类,或者尝试使用类似一组数字列表的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 2021-07-23
    • 2014-04-10
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多