Java 在hashmap中,如果存在重复值,如何将上一个键分配给下一个键
我正在尝试将上一个键分配给下一个键,以防hashmap中出现重复键 例如,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);
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));
}
}
}