Найти повторяющиеся значения в Java Map? - PullRequest
7 голосов
/ 01 августа 2011

Я хочу отобразить значения в HashMap.HashMap может иметь повторяющиеся значения (но не дублирующие ключи), но я хочу отобразить значение только один раз.

Итак, я должен выяснить, имеет ли Map повторяющиеся значения.Я знаю, что мы можем перебрать Map и использовать возвращаемое логическое значение map.containsValue(value).Я хочу знать, существует ли какой-либо метод для поиска повторяющихся значений в карте, или я должен сам написать код?

Ответы [ 6 ]

19 голосов
/ 01 августа 2011

Простым решением было бы сравнить размер списка значений с установленными значениями.

// 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
6 голосов
/ 01 августа 2011

Пример:

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]
1 голос
/ 28 октября 2014

Используйте метод класса библиотеки Apache Commons

org.apache.commons.collections.MapUtils.invertMap(map)

и сравните размер фактической карты и карты инвертирования.

1 голос
/ 01 августа 2011

Начиная с jdk1.6 такой метод не предусмотрен.

Один простой способ сделать это -

  • получить все значения с карты в списке
  • поместите этот список в набор, который удалит дубликаты
0 голосов
/ 11 января 2018
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());
    }
}
    }
}
0 голосов
/ 14 января 2015

Попробуйте этот код

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;

}
...