Java 如何在hashmap中打印具有重复值的键?
我有一个hashmap,其中一些键指向相同的值。我想找到所有相等的值并打印相应的键 这是我拥有的当前代码:Java 如何在hashmap中打印具有重复值的键?,java,hashmap,duplicates,Java,Hashmap,Duplicates,我有一个hashmap,其中一些键指向相同的值。我想找到所有相等的值并打印相应的键 这是我拥有的当前代码: Map<String, String> map = new HashMap<>(); map.put("hello", "0123"); map.put("hola", "0123"); map.put("kosta", "0123"); map.put("da", "03"); map.put("notda", "
Map<String, String> map = new HashMap<>();
map.put("hello", "0123");
map.put("hola", "0123");
map.put("kosta", "0123");
map.put("da", "03");
map.put("notda", "013");
map.put("twins2", "01");
map.put("twins22", "01");
List<String> myList = new ArrayList<>();
for (Map.Entry<String, String> entry : map.entrySet()) {
for (Map.Entry<String, String> entry2 : map.entrySet()){
if (entry.getValue().equals(entry2.getValue()))
{
myList.add(entry.getKey());
}
}
}
Map Map=newhashmap();
地图。放置(“你好”,“0123”);
地图放置(“hola”,“0123”);
地图放置(“kosta”,“0123”);
地图放置(“da”、“03”);
地图放置(“notda”、“013”);
地图放置(“twins2”、“01”);
地图放置(“twins22”、“01”);
List myList=new ArrayList();
对于(Map.Entry:Map.entrySet()){
对于(Map.Entry entry2:Map.entrySet()){
if(entry.getValue().equals(entry2.getValue()))
{
添加(entry.getKey());
}
}
}
当前代码将重复项添加到列表中两次,但也会将每个键添加一次
谢谢。您可以通过以下方式使用流检索副本:
List<String> myList = map.stream()
.filter(n -> Collections.frequency(map.values(), n) > 1)
.collect(Collectors.toList());
构建一个地图
,即地图
范例
如果没有过滤器()
,结果将是:
01=[twins22,twins2]
013=[notda]
03=[da]
0123=[kosta,你好,hola]
如果您想要流式API之外的解决方案
public static void duplicatedValuesMap() {
Map<String, String> map = new HashMap<>();
map.put("hello", "0123");
map.put("hola", "0123");
map.put("kosta", "0123 test");
map.put("da", "03");
map.put("notda", "013");
map.put("twins2", "01");
map.put("twins22", "01");
HashMap<String, List<String>> valueToKeyMapCounter = new HashMap<>();
for (Map.Entry<String, String> entry : map.entrySet()) {
if (valueToKeyMapCounter.containsKey(entry.getValue())) {
valueToKeyMapCounter.get(entry.getValue()).add(entry.getKey());
} else {
List<String> keys = new ArrayList<>();
keys.add(entry.getKey());
valueToKeyMapCounter.put(entry.getValue(), keys);
}
}
for (Map.Entry<String, List<String>> counterEntry : valueToKeyMapCounter.entrySet()) {
if (counterEntry.getValue().size() > 1) {
System.out.println("Duplicated Value:" + counterEntry.getKey() + " for Keys:" + counterEntry.getValue());
}
}
}
publicstaticvoidduplicatedValuesMap(){
Map Map=newhashmap();
地图。放置(“你好”,“0123”);
地图放置(“hola”,“0123”);
地图放置(“kosta”,“0123测试”);
地图放置(“da”、“03”);
地图放置(“notda”、“013”);
地图放置(“twins2”、“01”);
地图放置(“twins22”、“01”);
HashMap valueToKeyMapCounter=新HashMap();
对于(Map.Entry:Map.entrySet()){
if(valueToKeyMapCounter.containsKey(entry.getValue())){
获取(entry.getValue()).add(entry.getKey());
}否则{
列表键=新的ArrayList();
key.add(entry.getKey());
valueToKeyMapCounter.put(entry.getValue(),键);
}
}
对于(Map.Entry country:valueToKeyMapCounter.entrySet()){
if(counterEntry.getValue().size()>1){
System.out.println(“复制值:”+counterEntry.getKey()+”,对于键:“+counterEntry.getValue()”);
}
}
}
我认为其他答案已经很好地解决了这个问题,我支持另一种方法来进行扩展思考。这种方法需要使用的MutliMap
界面:
// init the input map
Map<String, String> map = new HashMap<>();
map.put("hello", "0123");
map.put("hola", "0123");
map.put("kosta", "0123");
map.put("da", "03");
map.put("notda", "013");
map.put("twins2", "01");
map.put("twins22", "01");
// swap key and value of the input map,since different key has same value
// so we need Multimap
Multimap<String, String> container = ArrayListMultimap.create();
map.entrySet().forEach(entry -> container.put(entry.getValue(), entry.getKey()));
container.keySet().stream()
.filter(s -> container.get(s).size() > 1).
forEach(System.out::println);
//初始化输入映射
Map Map=newhashmap();
地图。放置(“你好”,“0123”);
地图放置(“hola”,“0123”);
地图放置(“kosta”,“0123”);
地图放置(“da”、“03”);
地图放置(“notda”、“013”);
地图放置(“twins2”、“01”);
地图放置(“twins22”、“01”);
//交换输入映射的键和值,因为不同的键具有相同的值
//所以我们需要多重映射
Multimap容器=ArrayListMultimap.create();
map.entrySet().forEach(entry->container.put(entry.getValue(),entry.getKey());
container.keySet().stream()
.filter->container.get.size()>1)。
forEach(System.out::println);
输出:01
0123迭代每个条目。将该值添加到新集合中,如果该值已包含在其中,请检查。这保证了运行时为O(n)。如果您关心性能,最好使用另一个HashMap将值存储为映射到数组的键或原始HashMap中的键列表。
public static void duplicatedValuesMap() {
Map<String, String> map = new HashMap<>();
map.put("hello", "0123");
map.put("hola", "0123");
map.put("kosta", "0123 test");
map.put("da", "03");
map.put("notda", "013");
map.put("twins2", "01");
map.put("twins22", "01");
HashMap<String, List<String>> valueToKeyMapCounter = new HashMap<>();
for (Map.Entry<String, String> entry : map.entrySet()) {
if (valueToKeyMapCounter.containsKey(entry.getValue())) {
valueToKeyMapCounter.get(entry.getValue()).add(entry.getKey());
} else {
List<String> keys = new ArrayList<>();
keys.add(entry.getKey());
valueToKeyMapCounter.put(entry.getValue(), keys);
}
}
for (Map.Entry<String, List<String>> counterEntry : valueToKeyMapCounter.entrySet()) {
if (counterEntry.getValue().size() > 1) {
System.out.println("Duplicated Value:" + counterEntry.getKey() + " for Keys:" + counterEntry.getValue());
}
}
}
// init the input map
Map<String, String> map = new HashMap<>();
map.put("hello", "0123");
map.put("hola", "0123");
map.put("kosta", "0123");
map.put("da", "03");
map.put("notda", "013");
map.put("twins2", "01");
map.put("twins22", "01");
// swap key and value of the input map,since different key has same value
// so we need Multimap
Multimap<String, String> container = ArrayListMultimap.create();
map.entrySet().forEach(entry -> container.put(entry.getValue(), entry.getKey()));
container.keySet().stream()
.filter(s -> container.get(s).size() > 1).
forEach(System.out::println);