Найти повторяющиеся значения в Java Map?
Я хочу отобразить значения в HashMap
. А HashMap
может иметь повторяющиеся значения (но не повторяющиеся ключи), но я хочу отобразить значение только один раз.
поэтому я должен найти, является ли Map
имеет повторяющихся значений. Я знаю, что мы можем перебирать Map
и используйте возвращаемое логическое значение map.containsValue(value)
. Я хочу знать, существует ли какой-либо метод для поиска повторяющихся значений в map или я должен написать код сам?
6 ответов
простым решением было бы сравнить размер списка значений с набором значений.
// pseudo-code
List<T> valuesList = map.values();
Set<T> valuesSet = new HashSet<T>(map.values);
// check size of both collections; if unequal, you have duplicates
пример:
Map<Object, Object> map = new HashMap<Object, Object>();
map.put(1,2);
map.put(3,4);
map.put(2,2);
map.put(5,3);
Set<Object> uniqueValues = new HashSet<Object>(map.values());
System.out.println(uniqueValues);
выход:
[2, 3, 4]
нет такого метода, предусмотренного в jdk1.6.
один простой способ сделать это
- получить все значения с карты в списке
- поместите этот список в набор, который удалит дубликаты
используйте метод класса библиотеки Apache commons
org.apache.commons.collections.MapUtils.invertMap(map)
и сравните размер фактической карты и инвертировать карту.
попробуйте этот код
private boolean hasDuplicates(Map<Integer, List<String>> datamap){
boolean status = false;
Set valueset=new HashSet(datamap.values());
if(datamap.values().size()!=valueset.size()){
status=true;
}
else{
status = false;
}
return status;
}
try this code but this is not optimize code :
public class HashMapDulicate {
public static void main(String[] args) {
Map<String,Integer> map=new HashMap<>();
map.put("A", 1);
map.put("B", 1);
map.put("C", 3);
map.put("D", 4);
Set set=new HashSet<>();
List list=new ArrayList<>();
for(Entry<String, Integer> mapVal:map.entrySet()) {
if(!set.add(mapVal.getValue())) {
list.add(mapVal.getValue());
}else {
set.add(mapVal.getValue());
}
}
for(Entry<String, Integer> mapVal:map.entrySet()) {
if(list.contains(mapVal.getValue())){
System.out.println(mapVal.getKey() +":" + mapVal.getValue());
}
}
}
}