JAVA - HashMap检查特定键值(如果更大)

时间:2016-09-21 11:45:24

标签: java hashmap

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:......)循环,但我不知道如何获得特定键的值(我不是在谈论键值,我在谈论特定键的值)保持)

我想只更新特定(现有)密钥所持有的值,如果密钥保存的值更大,并且要添加的值小于当前值。

2 个答案:

答案 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并不真正支持函数式编程。有一个简单的部分应用方式会很好。 这是一个带有静态方法的版本,它部分应用了一些值并返回BiFunctionf是一个高阶函数)。

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