[英]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的無價值的建議/幫助。
如果我理解正確,則需要一個可以在其中添加密鑰的列表,但該列表不應允許添加重復的密鑰。 然后的解決方案是使用Set
( Oracle文檔 ):
Set<Integer> mySet = new TreeSet<Integer>();
Java還提供了一個Hashset
( Oracle 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.