繁体   English   中英

HashMap中的Void类作为Value对象

[英]Void Class in HashMap as a Value object

我知道HasMap是一个键-值对的基本知识,但是我想拥有一个包含的HashMap (无值)

我想在我的复杂方法(即仅具有键且没有与这些键相关联的值的HashMap下的Java代码段下放置。 我的要求是我正在处理重复记录List ,并且在比较期间,我在HasMap仅保留一个标识符值(来自重复项组),以后可以比较系统是否已经处理了它。

这是代码段(由于Void类无法实例化,导致编译时错误)。

Map<Integer,Void> map=new HashMap<Integer, Void>();

//Some Logic goes here

map.put("ss",new Void());

欢迎任何仅具有HasMap的无价值的建议/帮助。

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

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

Java还提供了一个HashsetOracle Documentation

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

您可能还需要自己的Comparator

通常,您可以使用Set来解决此类问题,因为根本不使用值时就不需要键-值结构。

正确的解决方案

    Set<String> uniqueValues = new HashSet<String>();
    uniqueValues.add( "a" );
    uniqueValues.add( "a" );
    assert uniqueValues.size() == 1;

请注意,这只是出于完整性的考虑,我将始终使用Set来满足您的要求,其余的则更多是为了使学习/使人困惑:

由于Void具有私有构造函数,因此您无法使用新的关键字创建实例。

但是,至少有两种可能性可以在地图中放置某些内容。 解决方案之一是将null添加为值。 因为无论如何您都不需要它。 第二个将使用反射来忽略Void类的私有构造函数。

破解方案

    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;

为什么不只使用另一个列表? 如果出于任何原因确实需要使用HashMap,则可以添加null值而不是void。

Map<Integer,Object> map=new HashMap<Integer, Object>();

map.put("ss", null);

请不要这样做。 HashMap是作为键值对的Map 一个Map没有价值不是Map

如果你想存储的值没有重复使用Set -一个的HashSet的例子。

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

这是javadoc关于Void说法->

Void类是一个无法实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM