Map<Integer, Integer> listInfo = new HashMap<Integer, Integer>();
我一直试图从谷歌搜索,但我真的不知道为什么我找不到正确的解决方案。无论如何,我的HashMap将存储两个整数。我会使用普通的“int []”字符串列表或者它所要求的任何东西,但它会返回一些关于“数组outofbounds”的异常或与之相关的东西,因为它的索引将大于int。不确定,但无论如何让我们留在这个主题。
我的英语非常糟糕,但是如果你不明白我在说什么希望这会有所帮助。 (只是想法,不是基于实际代码)
if(listInfo.containsKey(key)) {
if(listInfo.getKeyValue(key).valueOfKey() > valueToBeAdded) {
listInfo.put(key, valueToBeAdded);
}
} else {
listInfo.put(key, valueToBeAdded);
}
我尝试过与上面类似的方法,但是功能非常正确,但它会发生冲突,因为它说它无法将键值与int进行比较,因为键值是对象?为什么它是对象,因为我已经定义它应该是Integer?我也尝试过(Entry entry:......)循环,但我不知道如何获得特定键的值(我不是在谈论键值,我在谈论特定键的值)保持)
我想只更新特定(现有)密钥所持有的值,如果密钥保存的值更大,并且要添加的值小于当前值。
答案 0 :(得分:1)
在下面找到一个能够满足您需求的片段(假设我理解您的意图)。
Map<Integer, Integer> listInfo = new HashMap<>();
listInfo.put(1, 23);
listInfo.put(2, 45);
Integer valueToBeAdded = 42;
System.out.println("listInfo = " + listInfo);
if (listInfo.containsKey(1)) {
if (listInfo.get(1) < valueToBeAdded) {
listInfo.put(1, valueToBeAdded);
}
} else {
listInfo.put(1, valueToBeAdded);
}
System.out.println("listInfo = " + listInfo);
输出
listInfo = {1=23, 2=45} // the initial listInfo entries (key, value)
listInfo = {1=42, 2=45} // after the value for key `1` has been updated
答案 1 :(得分:0)
看起来您只想放置较小的值
为此,您可以使用Map.compute
:
final HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();
map.put(123, 456);
System.out.println(map);
final int x = 234;
final BiFunction<? super Integer, ? super Integer, ? extends Integer> f =
(k, v) -> v == null ? x : Math.min(v, x);
map.compute(123, f);
map.compute(999, f);
System.out.println(map);
遗憾的是,Java并不真正支持函数式编程。有一个简单的部分应用方式会很好。
这是一个带有静态方法的版本,它部分应用了一些值并返回BiFunction
(f
是一个高阶函数)。
public static void main(final String[] arrg) {
final HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();
map.put(123, 456);
System.out.println(map);
map.compute(123, f(345));
map.compute(123, f(99999));
map.compute(999, f(888));
System.out.println(map);
}
static BiFunction<? super Integer, ? super Integer, ? extends Integer> f(final int x) {
return (k, v) -> v == null ? x : Math.min(v, x);
}