class Solution {
// countNums 是一个私有方法,用于统计数组中每个元素出现的次数。
// 它接收一个整型数组 nums 作为参数,并返回一个 Map,其中包含元素及其出现次数。
private Map<Integer, Integer> countNums(int[] nums) {
// 创建一个 HashMap,用于存储每个元素及其出现次数。
Map<Integer, Integer> counts = new HashMap<Integer, Integer>();
// 遍历输入数组 nums 中的每个元素。
for (int num : nums) {
// 如果 HashMap 中还没有这个元素,则添加它并设置其计数为 1。
if (!counts.containsKey(num)) {
counts.put(num, 1);
} else {
// 如果 HashMap 中已经有这个元素,则将其计数加 1。
counts.put(num, counts.get(num) + 1);
}
}
// 返回包含所有元素及其出现次数的 HashMap。
return counts;
}
// majorityElement 是一个公共方法,用于找出数组中的众数。
// 它接收一个整型数组 nums 作为参数,并返回数组中的众数。
public int majorityElement(int[] nums) {
// 调用 countNums 方法统计数组中每个元素的出现次数,并将结果存储在 counts 变量中。
Map<Integer, Integer> counts = countNums(nums);
// 初始化一个变量 majorityEntry 用于存储出现次数最多的元素及其次数。
// 初始时设置为 null,以便在后续遍历中进行比较。
Map.Entry<Integer, Integer> majorityEntry = null;
// 遍历 counts 映射中的所有键值对。
for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
// 如果 majorityEntry 为 null 或者当前遍历到的元素出现次数大于 majorityEntry 的出现次数,
// 更新 majorityEntry 为当前遍历到的键值对。
if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()) {
majorityEntry = entry;
}
}
// 返回出现次数最多的元素,即众数。
// majorityEntry.getKey() 将返回键值对中的键,也就是元素本身。
return majorityEntry.getKey();
}
}
-
Map.Entry
是一个接口,它代表映射(Map
)中的一个键值对。每个键值对包含两个部分:键(key)和值(value)。Map.Entry
接口提供了几种方法来访问和操作这些键和值:-
getKey()
: 返回映射条目的键。 -
getValue()
: 返回映射条目的值。 -
setValue(V value)
: 替换映射条目的值并返回旧值。
-
-
Map
接口的entrySet()
方法返回的是一个Set
集合,这个集合包含了Map
中所有的键值对条目(Map.Entry
对象)。每个条目都实现了Map.Entry
接口,提供了访问键和值的方法-
当你调用
counts.entrySet()
,实际上是在获取counts
这个Map
中所有键值对的一个视图。这个视图允许你遍历Map
中的每个条目,并对它们进行迭代。
-
-
for循环遍历
HashMap
的过程中,不断更新majorityEntry
,使其始终指向当前出现次数最多的元素。当遍历结束后,majorityEntry
将指向具有最高出现次数的元素,即众数。