2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面以了解更多关于如何使用本网站的信息。

0
data.int-map

`
(iset/union (iset/int-set)

        (iset/dense-int-set))

`

引发 java.lang.IllegalArgumentException: 无法合并不同密度的整集合。

这可能不是真正的错误,但GitHub上的README声称

bq. dense-int-set 与 int-set 的行为相同,唯一的区别是它们在内存效率上的不同。

我认为应该可以混合稠密/正常集合,或者在文档中明确指出这一点,并可能会更改错误消息,因为对于我来说这不明显(我完全忘记了我在这个地方使用了稠密集合,并且认为问题是由暂时的原因引起的)。

3 个答案

0

由 ztellman 发布的评论

这略微复杂,所以我可能只是澄清一下,在文档开始时这可能不容易实现,但预期行为是对于不同密度的集合操作应返回一个较低密度的合并集合。

0

由 jbiserkov 发布的评论

有道理。

查看(链接:https://github.com/clojure/data.int-map/blob/5442570fafa3eb4bbeec3286d67c9295d484fc4f/src/main/java/clojure/data/int_map/IntSet.java#L371)文本:代码)时,我不确定检查/异常是否是“公共API”的一部分,或者它是否意图作为违反内部不变量的“early fail”信号给你。

非常感谢您的快速回复。在README文件中添加一条注释就足够了。交差集和差集不会抛出异常,因为它们不使用合并操作。从我对(《链接:https://github.com/clojure/data.int-map/blob/9b34590f56db3e92a39eeb8ea31a8e8afbfa09b3/src/main/java/clojure/data/int_map/IntSet.java#L366文字:代码)的理解来看:代码:#L366,虽然得到的集合具有此参数的密度(leafSize)。

这可以用作替代?这麻烦值得吗?

`
返回 new IntSet(Math.min(leafSize, s.leafSize),

              Math.min(log2LeafSize, s.log2LeafSize), 
              node);

`

可以将异常更为明确地声明为“无法计算 int 集合和密集 int 集合的并集”。

使用“构造函数”名称和操作失败的名称(使用 union 而不是 merge)可以使最终用户更清楚问题所在。

无关紧要:这已经不再影响我的程序了——只有第一个实现使用了并集/差集/交差集。第二个和第三个只使用 disj。第一个实现已经完成了它的目的——确保第二个是正确的。现在第二个可以用来验证第三个的正确性,在更多样化的输入集上,对于其中一些输入,密集集是有意义的。

0
参考: https://clojure.atlassian.net/browse/DIMAP-13 (由jbiserkov报告)
...