簡體   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