我知道HasMap
是键值对的基本原则,但我希望HashMap只包含键(无值)
我想在我的复杂方法中放入下面的java片段(即HashMap
只有Keys,没有与这些键相关联的值)。我的要求是我正在处理List
重复记录,并且在比较期间,我只保留HasMap
中的一个标识符值(来自重复组),我可以稍后比较系统是否已经处理过了。
这是代码片段(由于Void类是不可实现的,因此会产生编译时错误。)
Map<Integer,Void> map=new HashMap<Integer, Void>();
//Some Logic goes here
map.put("ss",new Void());
欢迎任何建议/帮助,以使HasMap只有没有价值的键。
答案 0 :(得分:2)
如果我理解正确,您需要一个可以添加密钥的列表,但不应该允许添加重复密钥。然后解决方案是使用Set
(Oracle Documentation):
Set<Integer> mySet = new TreeSet<Integer>();
Java还提供了Hashset
(Oracle Documentation)
Set<Integer> mySet = new HashSet<Integer>();
您可能还需要拥有Comparator
。
答案 1 :(得分:2)
通常你会使用Set来解决这个问题,因为在不使用该值时不需要键值结构。
正确的解决方案
Set<String> uniqueValues = new HashSet<String>();
uniqueValues.add( "a" );
uniqueValues.add( "a" );
assert uniqueValues.size() == 1;
请注意,这只是为了完整性我会一直使用Set来满足您的要求,其余的更多是为了娱乐/学习/混淆人:
由于Void具有私有构造函数,因此您无法使用新的关键字创建实例。
但是,至少有两种可能性可以在地图中添加一些东西。 解决方法之一是将null添加为值。因为你无论如何都不需要它。第二个将使用反射来忽略Void类的私有构造函数。
HACK SOLUTION
Map<String, Void> map = new HashMap<String,Void>();
Constructor<Void> constructor= (Constructor<Void>) Void.class.getDeclaredConstructors()[0];
constructor.setAccessible(true);
Void voidObj = constructor.newInstance();
map.put( "a", voidObj );
map.put( "a", voidObj );
assert map.size() == 1;
答案 2 :(得分:1)
为什么不使用其他清单?如果您出于某种原因确实需要使用HashMap,则只需添加空值而不是void。
Map<Integer,Object> map=new HashMap<Integer, Object>();
map.put("ss", null);
答案 3 :(得分:1)
请不要这样做。 HashMap
是Map
,它是键值对。没有值的Map
不是Map
。
如果您想存储没有重复的值,请使用Set
- 例如HashSet。
答案 4 :(得分:0)
首先,Void
类的构造函数是 private ,因此编译器会将new Void()
标记为错误。接下来,为了防止重复,您可以使用Set
。为什么不选择HashSet
?
这是javadoc对Void
- &gt;所说的内容
Void类是一个不可包含的占位符类来保存 引用表示Java关键字void的Class对象。