将HashMap中的Void类作为Value对象

时间:2014-09-17 11:45:30

标签: java collections map hashmap void

我知道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只有没有价值的键。

5 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要一个可以添加密钥的列表,但不应该允许添加重复密钥。然后解决方案是使用SetOracle Documentation):

Set<Integer> mySet = new TreeSet<Integer>();

Java还提供了HashsetOracle 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)

请不要这样做。 HashMapMap,它是键值对。没有值的Map不是Map

如果您想存储没有重复的值,请使用Set - 例如HashSet

答案 4 :(得分:0)

首先,Void类的构造函数是 private ,因此编译器会将new Void()标记为错误。接下来,为了防止重复,您可以使用Set。为什么不选择HashSet

这是javadoc对Void - &gt;所说的内容

  

Void类是一个不可包含的占位符类来保存   引用表示Java关键字void的Class对象。