2014-09-17 4 views
0

Я знаю, основной, что HasMap является Key-Value пара, но я хочу, чтобы иметь HashMap только с ключей (без значений)Пустота класса в HashMap как объект Value

Я хочу поставить ниже java-фрагмента в моем сложном методе (т. е. HashMap с использованием только ключей и никакого значения, связанного с этими ключами). Мое требование состоит в том, что я обрабатываю Duplicate Records, и во время сравнений я сохраняю только одно значение идентификатора (из группы дубликатов) в HasMap, которое я могу позже сравнить, независимо от того, обработала ли оно его или нет.

Вот фрагмент кода (дает ошибку времени компиляции, поскольку класс Void не может быть необратим).

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

//Some Logic goes here 

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

Любое предложение/помощь в использовании только HasMap. Ключи без ценности приветствуются.

+2

, то почему бы вам не использовать множество –

+0

A HashMap только с ключами не имеет смысла в любом случае - использовать другой класс Collection, который подходит для вашего варианта использования (некоторые Set, например) – LionC

+0

Да, дорогой, хотя я изменил свой сценарий, но хотел бы знать, есть ли способ добавить ссылки Void в HashMap. –

ответ

2

Обычно вы должны использовать набор для такой проблемы, потому что нет необходимости иметь структуру Key-Value, когда вы вообще не используете значение.

Правильное решение

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

Примечание это только для полноты я всегда использовать набор для вашего требования, а остальное больше для удовольствия/обучения/запутать людей:

С Пустота есть частный конструктор, чтобы вы не могли создать экземпляр с новым ключевым словом.

Однако есть хотя бы две возможности поместить что-то на вашу карту. Решение - добавить значение null в качестве значения. Потому что это тебе не нужно. И второй будет использовать отражение, чтобы игнорировать частный конструктор класса Void.

HACK РЕШЕНИЕ

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; 
+0

Спасибо mszalbach! Да, 'Set' соответствует лучшей коллекции в этом требовании, но мы должны знать и другую сторону (хотя ее неиспользование/глупость или преступление использовать :)) +1 для вашего решения Hack! –

1

Почему бы не просто использовать другой список? Если вам действительно нужно использовать HashMap по любой причине, вы можете просто добавить нулевые значения вместо void.

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

map.put("ss", null); 
+0

Почему downvote? –

+1

, потому что это очень плохое решение, которое не должно быть приемлемым для будущих программистов, которые хотят достичь того же, что и OP – LionC

+1

OP хочет HashMap без каких-либо значений, все ответы, кроме моих, не дают им то, что они хотят. –

1

Пожалуйста, не делайте этого. A HashMap - это Map, который представляет собой пару с ключом. A Map без значений не является Map.

Если вы хотите сохранить значения без дубликатов, используйте, например, Set - a HashSet.

+0

Спасибо, Лев. Да, вы правы в отношении использования коллекции, и есть несколько других коллекций для этого сценария, но я хотел бы знать, есть ли способ добавить ссылки Void в 'HashMap' –

+0

@ArunKumar Может быть - но я не вижу разумный аргумент, чтобы когда-либо иметь карту, которая по определению заполняется только нулем/Пустотой. – LionC

2

Если я правильно понял, вам нужен список, в котором вы можете добавлять ключи, но не должны позволять добавлять дубликаты ключей. Тогда решение заключается в использовании Set (Oracle Documentation):

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

Java также предоставляет Hashset (Oracle Documentation)

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

Вам также может понадобиться у вас есть Comparator.

0

Прежде всего конструктор Void класса частный, поэтому компилятор отметит new Void() как ошибки. Затем, чтобы предотвратить дубликаты, вы можете просто использовать Set. Почему бы не пойти с HashSet?.

Вот что Javadoc говорит о Void ->

Пустоты классом является uninstantiable класса заполнителя провести ссылки на объект класса, представляющего пустоту ключевого слова Java.

Смежные вопросы