【问题标题】:Insertion of null value in a ConcurrentSkipListMap Java在 ConcurrentSkipListMap Java 中插入空值
【发布时间】:2014-06-13 08:19:22
【问题描述】:

我知道这可能不是最好的做法,而且我没有正确使用这个对象,但这是我的问题。我想使用 ConcurrentSkipListMap 并声明了我的地图:

private ConcurrentSkipListMap<Date,T> map 

有时,我需要使用“null”值初始化此地图的元素,这意味着在给定的一天,没有数据。对于正常工作的常规 hastable,您可以插入与键关联的空值。在获取某个日期的值时,我只需要测试它是否为空。对于 ConcurrentSkipListMap,这不起作用。它抛出一个空值异常。在查看源代码时,我了解到这是节点的内部表示,其中 null 值仅表示列表中的节点已死。

我知道最好的答案是,在这种情况下不要添加日期......但由于很多原因,我仍然需要。无论如何,对我来说,测试密钥的存在与测试与密钥关联的空值是一样的。我也无法添加虚拟值,因为我无法区分这个虚拟值和真实值(例如,如果我的模板类是整数,即使我选择 -1 作为标志如果为空,我将无法看到这一天实际值为 -1 的差异)。

我以前用过

private SortedMap<Date,T> map = Collections.synchronizedSortedMap(new TreeMap<Date,T>(new BasicDateComparatorIncreasing()));

但我喜欢 ConcurentSkipListMap 实现了 ConcurrentNavigableMap 接口这一事实

有没有办法实现我想做的事情?

谢谢

【问题讨论】:

  • 你能写出某种 Maybe&lt;T&gt; 包装器,它只包含一个可能为空的 T 吗?

标签: java hashmap hashtable java.util.concurrent


【解决方案1】:

怎么样

private ConcurrentSkipListMap<Optional<Date>, T> map;

?

然后添加元素:

map.put(Optional.fromNullable(date), value);

访问密钥时检查Optional.isPresent() 并调用Optional.get()。

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Optional.html

【讨论】:

  • 您好,感谢您的帮助,我需要对此进行调查。乍一看,我的问题与值有关,而不是与键有关。我的钥匙永远不会为空。只有值可以。抱歉,如果我之前的问题在这一点上不清楚
  • @BlackLabrador 您可以对值使用相同的方法:ConcurrentSkipListMap&lt;Date, Optional&lt;T&gt;&gt;。
  • 效果很好!!!!感谢@pingw33n 的回答。很快,我将把它封装在一个新类中,这样我就不必更改剩余代码的行为。在某一时刻,我有一个函数返回所有值的数组列表 code ArrayList array = new ArrayList(map.values());code
  • 一个快速的,我将把它封装在一个新类中,这样我就不必更改剩余代码的行为。在某一时刻,我有一个函数可以返回一个包含所有值ArrayList&lt;T&gt; array = new ArrayList&lt;T&gt;(map.values()); 的数组列表。有没有一种有效的方法来返回原始值而不是数组列表中的Optional 类(无需通过列表的第二次迭代来测试isPresent)
  • 显然,Java 8 现在也有了 Optional Class。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 2018-08-30
  • 2016-03-30
  • 2015-05-23
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多