草庐IT

java - SingletonSet 为什么不实现 SortedSet

coder 2024-03-11 原文

为了减少内存消耗,我正在重写一个具有 SortedSet<Integer> 的类.在 80% 的情况下,这个集合只包含一个元素。所以我想我可以使用 SingeltonSet在这些情况下,正常的 TreeSet在其他情况下。现在我注意到 SingletonSet ,由 Collections.singleton() 返回, 不执行 SortedSet .这个缺点有什么原因吗?我会说,一个单一的元素总是可以被认为是排序的。我必须自己写吗 SingletonSet实现?

最佳答案

这是一个有趣的点,它似乎说明了集合 API 中的一个小漏洞。

事实是 Collections.singleton() 被指定返回一个 Set,而不是 SortedSet,事实上实现并没有' 支持该接口(interface)。我认为 Collections.singleton() 更改其行为并返回 SortedSet 的实例不会有帮助。这将鼓励实现执行 instanceof 检查和向下转换。 (对应的 Map 方法和接口(interface)也类似。)

对于这个用例来说这是一个小小的安慰,但在 Java SE 8 中引入了新方法 Collections.emptyNavigableMapemptyNavigableSet。这对于需要空的可导航集合的用例很有帮助,但如果您真的想要一个具有单个元素或映射的可导航集合,那您就不走运了。有增强请求 JDK-6201174覆盖相似区域;我对其进行了更新并重新聚焦于为单例可导航集和 map 提供 API。

但是等等!如你pointed out ,有一些额外的状态与排序/可导航的集合一起运行,这是比较器。 (或者在没有比较器的情况下,隐含地提供自然排序的比较器。)任何新的单例 API 也将为此提供。这指出了一个事实,即我上面提到的 empty* 方法没有谈论比较器。这似乎是另一个错误:JDK-8181754 .

不幸的是,除了全力以赴并实现一个单元素(可能是不可变的 SortedSet 或 NavigableSet)之外,我没有真正好的解决方法。你可以从 Collections.UnmodifiableNavigableSet 开始.这有一点帮助,但帮助不大。事实上,空的可导航集就是其中之一,它包裹在一个空的 TreeSet 周围!这是非常无益的,因为您想避免 TreeSet 实例。

我可能会从 AbstractSet 开始,然后添加来自 SortedSet 的最小方法集。方法比 NavigableSet 中的方法少得多,因此如果您不需要它的所有花里胡哨的东西,坚持使用 SortedSet 会是一个较小的任务。

关于java - SingletonSet 为什么不实现 SortedSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44399058/

有关java - SingletonSet 为什么不实现 SortedSet的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  3. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  4. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  7. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  8. ruby - 为什么人们使用 `Module.send(:prepend, …)` ? - 2

    我正在学习如何在我的Ruby代码中使用Module.prepend而不是alias_method_chain,我注意到有些人使用send调用它(example):ActionView::TemplateRenderer.send(:prepend,ActionViewTemplateRendererWithCurrentTemplate)而其他人直接调用它(example):ActionView::TemplateRenderer.prepend(ActionViewTemplateRendererWithCurrentTemplate)而且,虽然我还没有看到任何人使用这种风格,但我从

  9. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

随机推荐