Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hashmap中,如果存在重复值,如何将上一个键分配给下一个键_Java_Collections_Hashmap - Fatal编程技术网

Java 在hashmap中,如果存在重复值,如何将上一个键分配给下一个键

Java 在hashmap中,如果存在重复值,如何将上一个键分配给下一个键,java,collections,hashmap,Java,Collections,Hashmap,我正在尝试将上一个键分配给下一个键,以防hashmap中出现重复键 例如,hashmap中的重复条目: 5-->51 6-->51 我希望输出如下: 5-->51 5-->51 下面是我的代码: HashMap<Integer, Integer> map = new HashMap(); map.put(1, 99); map.put(2, 120); map.put(3, 89); map.put(4, 71);

我正在尝试将上一个键分配给下一个键,以防hashmap中出现重复键

例如,hashmap中的重复条目:

5-->51  
6-->51
我希望输出如下:

5-->51  
5-->51
下面是我的代码:

HashMap<Integer, Integer> map = new HashMap();
    map.put(1, 99);
    map.put(2, 120);
    map.put(3, 89);
    map.put(4, 71);
    map.put(5, 51);
    map.put(6, 51);
    map.put(7, 77);
    map.put(8, 44);
    map.put(9, 22);
    Set set = new HashSet<>();
    List list = new ArrayList<>();
    for (Entry<Integer, Integer> mapVal : map.entrySet()) {
        if (!set.add(mapVal.getValue())) {
            list.add(mapVal.getValue());
        } else {
            set.add(mapVal.getValue());
        }
    }
    for (Entry<Integer, Integer> mapVal : map.entrySet()) {
        if (list.contains(mapVal.getValue())) {
            System.out.println(mapVal.getKey() + "-->" + mapVal.getValue());
        }
    }
HashMap map=newhashmap();
地图.put(1,99);
地图放置(2120);
地图.put(3,89);
地图.put(4,71);
地图.put(5,51);;
地图.put(6,51);
地图.put(7,77);
地图.put(8,44);
地图.put(9,22);
Set=newhashset();
列表=新的ArrayList();
对于(条目mapVal:map.entrySet()){
如果(!set.add(mapVal.getValue())){
add(mapVal.getValue());
}否则{
set.add(mapVal.getValue());
}
}
对于(条目mapVal:map.entrySet()){
if(list.contains(mapVal.getValue())){
System.out.println(mapVal.getKey()+“-->”+mapVal.getValue());
}
}

在hashmap的情况下可能吗?如果是这样,我应该使用什么算法或代码?

如果我没有弄错你的问题。无论是哪种地图,地图中都不可能有重复的关键点。您需要两个值的同一个键,这是不可能的。

正如@AliOmar62所指出的,在map中不能有重复的键

您可以做的是使用值反转键,并将所有值收集到集合中,例如

    Map<Integer, List<Integer>> sameValueToDiffKeys = map.entrySet()
            .stream()
            .map(e -> new SimpleImmutableEntry<>(e.getValue(), e.getKey()))
            .collect(Collectors.toMap(SimpleImmutableEntry::getKey, e -> new ArrayList<>(Collections.singleton(e.getValue())), (first, second) -> {
                first.addAll(second);
                return first;
            }));
请看一下merge函数,它是收集器.toMap的第三个参数

此函数通过将密钥合并到一个集合来解析一个密钥的所有重复

我希望输出如下:


您无法使用地图获得这样的东西,因为键是唯一的。

作为在输出中获得该结果的变通方法,您应该使用维护元素插入顺序的
Map
实现:
LinkedHashMap

HashMap
不维护它

那么想法就相当简单了:

  • 从贴图关键点创建列表,并从贴图值创建另一个列表
  • 迭代值列表并更新键列表的元素,其中关联的值包含已遇到的值
  • 输出列表
下面是一个示例代码:

public class Foo {

    public static void main(String[] args) {

        HashMap<Integer, Integer> map = new LinkedHashMap<>();
        map.put(1, 99);
        map.put(2, 120);
        map.put(3, 89);
        map.put(4, 71);
        map.put(5, 51); // 51 value
        map.put(6, 51); // 51 value
        map.put(7, 77);
        map.put(8, 51); // 51 value
        map.put(9, 22);

        List<Integer> keys = new ArrayList<>(map.keySet());
        List<Integer> values = new ArrayList<>(map.values());

        Set<Integer> valuesWithKeyUpdated = new HashSet<>();
        for (int i = 0; i < values.size() - 1; i++) {

            final Integer oldestKeyForCurrentValue = keys.get(i);
            final Integer currentValue = values.get(i);

            if (valuesWithKeyUpdated.contains(currentValue)) {
                continue;
            }

            for (int j = 1; j < values.size(); j++) {
                if (currentValue == values.get(j)) {
                    keys.set(j, oldestKeyForCurrentValue);
                }
            }

            valuesWithKeyUpdated.add(values.get(i));
        }


        for (int i = 0; i < keys.size(); i++) {
            System.out.println("key=" + keys.get(i) + ", value="+ values.get(i));

        }
    }
}
公共类Foo{
公共静态void main(字符串[]args){
HashMap=newLinkedHashMap();
地图.put(1,99);
地图放置(2120);
地图.put(3,89);
地图.put(4,71);
map.put(5,51);//51值
map.put(6,51);//51值
地图.put(7,77);
map.put(8,51);//51值
地图.put(9,22);
List keys=newarraylist(map.keySet());
列表值=新的ArrayList(map.values());
Set valuesWithKeyUpdated=新哈希集();
对于(int i=0;i
键=1,值=99

键=2,值=120

键=3,值=89

键=4,值=71

key=5,value=51//value 51与原始地图中的key 5

键=5,值=51//值51:显示5而不是6

键=7,值=77

key=5,value=51//value 51:显示5而不是8

键=9,值=22


在我写答案之前,我想确保您意识到HashMap是一个无序的结构。你知道吗?所以如果你把值按顺序排列,它们就不能保证按顺序排列?我能想到你为什么会这样做,但我想确保你使用的是正确的结构。请使用泛型。是的,我知道HashMap是一个无序的结构。你不能用映射得到这样的东西,因为键是唯一的。你不能有重复的键,正如其他人提到的,但是,如果不需要重复的值,可以从映射中删除重复的值。这就是你想做的吗?您是想只打印输出而不更改实际的键,还是需要更改键?您是否需要有一个重复的键值对,或者您可以只使用一个键值对,而不使用任何其他具有相同值的键值对?你到底想用它做什么?我现在得到了我所期望的,即使我们知道hashmap中不允许重复键。实际上,我需要这个要求来制作PDF报告中的条形图,因为条形图的变化取决于我用hashmap键映射的计费单位。谢谢你的努力。@Akash Lanjewar欢迎你:)如果我的回答有道理,请毫不犹豫地投赞成票或接受它。
5-->51
5-->51
public class Foo {

    public static void main(String[] args) {

        HashMap<Integer, Integer> map = new LinkedHashMap<>();
        map.put(1, 99);
        map.put(2, 120);
        map.put(3, 89);
        map.put(4, 71);
        map.put(5, 51); // 51 value
        map.put(6, 51); // 51 value
        map.put(7, 77);
        map.put(8, 51); // 51 value
        map.put(9, 22);

        List<Integer> keys = new ArrayList<>(map.keySet());
        List<Integer> values = new ArrayList<>(map.values());

        Set<Integer> valuesWithKeyUpdated = new HashSet<>();
        for (int i = 0; i < values.size() - 1; i++) {

            final Integer oldestKeyForCurrentValue = keys.get(i);
            final Integer currentValue = values.get(i);

            if (valuesWithKeyUpdated.contains(currentValue)) {
                continue;
            }

            for (int j = 1; j < values.size(); j++) {
                if (currentValue == values.get(j)) {
                    keys.set(j, oldestKeyForCurrentValue);
                }
            }

            valuesWithKeyUpdated.add(values.get(i));
        }


        for (int i = 0; i < keys.size(); i++) {
            System.out.println("key=" + keys.get(i) + ", value="+ values.get(i));

        }
    }
}