2011-08-01 226 views
7

我想显示HashMap中的值。 A HashMap可能有重复值(但不是重复键),但我只想显示一次值。在Java Map中查找重复值?

所以我应该找到Map是否有重复的值。我知道我们可以迭代Map并使用map.containsValue(value)的返回布尔值。我想知道是否存在任何方法在地图中查找重复值,或者我应该自己编写代码?

回答

19

一个简单的解决方案是将您的值列表的大小与您的值集进行比较。

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

这是有效的代码本身,而不是伪代码:) – Nivas

+0

这高科技的罚款。但如果我想删除重复的意思应该做手动删除操作的权利? – Silambarasan

+0

是的,你必须做一个手动操作。但是,如果你能向我解释* exact *的情况,就像你最终得到多个具有相同值的键以及为什么要删除它们一样,也许我可以提出一个更好的解决方案。 –

1

没有提供像jdk1.6这样的方法。你可以做

一个简单的方法是

  • 获得从地图中的所有值列表
  • 把该列表转换成一组,将删除重复的
5

例子:

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

使用Apache公共库类的方法

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

和比较实际的地图和地图反转的大小。

0

尝试这个代码

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; 

} 
0
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()); 
    } 
} 
    } 
}