import java.util.*;


public class Solution {
    public int MoreThanHalfNum_Solution (int[] numbers) {
        // write code here
        Map<Integer, Integer> valueMap = new HashMap<>();
        for (int i = 0; i < numbers.length; i++) {
            int num = numbers[i];
            valueMap.merge(num, 1, Integer::sum);
            if (valueMap.get(num) > numbers.length / 2)
            return num;
        }
        return 0;
    }
}

在Java 8及以上版本中,HashMap 类提供了一个名为 merge 的方法,它是一个非常方便的功能,用于更新映射的值。merge 方法通常用于以下场景:

  • 当键不存在时,初始化它。
  • 当键存在时,根据提供的函数更新它的值。

merge 方法的签名如下:

V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)

参数说明:

  • key:要更新的键。
  • value:要与现有值结合的新值(如果存在)。
  • remappingFunction:一个函数,用于定义如何结合新值和现有值。如果键不存在,此函数将只接收到新值。

返回值:

  • 映射之后与键关联的值。

可以直接写成

valueMap.merge(num, 1, (oldValue, newValue) -> oldValue - newValue);

使用 merge 方法,你可以将之前提到的代码片段优化为:

valueMap.merge(num, 1, Integer::sum);

这行代码的意思是:对于键 num,使用值 1 与当前值(如果存在)进行合并,合并的方式是使用 Integer::sum 函数,即简单地将两个整数值相加。如果 num 之前不存在于 valueMap 中,它将被添加进去,并将值设置为 1。如果 num 已经存在,1 将被加到现有的值上。

在你的原始问题上下文中,使用 merge 方法可以使代码更加简洁:

public int MoreThanHalfNum_Solution(int[] numbers) {
    Map<Integer, Integer> valueMap = new HashMap<>();
    for (int num : numbers) {
        valueMap.merge(num, 1, Integer::sum);
        if (valueMap.get(num) > numbers.length / 2) {
            return num;
        }
    }
    return 0;
}

这段代码将为数组中的每个数字更新 valueMap 中的计数,并在找到超过一半的数值时立即返回它。如果遍历完整个数组都没有找到这样的数值,则返回 0