判断数组中只出现一次的元素数量 判断数组中只出现次数最多的前三个元素
package com.lihaozhe.util;
import java.util.*;
import java.util.stream.Collectors;
/**
* 工具类
*
* @author 李昊哲
* @version 1.0.0
*/
public class Util {
/**
* 该数组只出现一次的数字数量 如果没有返回 0
*
* @param nums 数组参数
* @return 只出现一次的数量
*/
public static int fun01(int... nums) {
if (nums == null || nums.length == 0) {
// 如果传入空数组 直接返回 0
return 0;
}
// 将传入的数组存入 预设的map中
Map<Integer, List<Integer>> map = wrapper(nums);
// 1、map中获取entrySet
// 2、entrySet转为stream
// 3、过滤出 value 中只有一个元素的 entry
// 4、统计数量
return (int) map.entrySet().stream().filter(entry -> entry.getValue().size() == 1).count();
}
/**
* 该数组只出现次数最多的前三个数字
*
* @param nums 数组参数
* @return 只出现一次的数量
*/
public static List<Integer> fun02(int... nums) {
if (nums == null || nums.length == 0) {
// 如果传入空数组 直接返回 空集合
return new ArrayList<>();
}
// 将传入的数组存入 预设的map中
Map<Integer, List<Integer>> map = wrapper(nums);
// 1、map中获取entrySet
// 2、entrySet转为stream
// 3、按照 entry 的 value 中元素的数量降序排序
// 4、截取前三个 entry
// 5、截取后 返回集合中
List<Map.Entry<Integer, List<Integer>>> collect = map.entrySet().stream().sorted((o1, o2) -> o2.getValue().size() - o1.getValue().size()).limit(3).collect(Collectors.toList());
// 获取集合中 entry 的 key 存储集合中并返回
return collect.stream().map(Map.Entry::getKey).collect(Collectors.toList());
}
/**
* 将数据封装到固定格式的map中
* 数组中的元素作为key 每出现一次 将该元素存到集合中并将该集合作为 该元素的 key 的 value
*
* @param nums 数组参数
* @return 封装好的数据
*/
private static Map<Integer, List<Integer>> wrapper(int... nums) {
// 存储容器
Map<Integer, List<Integer>> map = new HashMap<>();
// 遍历参数数组
for (int num : nums) {
// 声明 value 容器
List<Integer> list;
if (map.containsKey(num)) {
// 如果 该元素在容器中存在 那就将该元素的 value 取出
list = map.get(num);
// 将新元素添加刀集合中
list.add(num);
} else {
// 如果 该元素在容器中不存在 那就将该元素的 存储 集合中 等待向容器中存储
list = new ArrayList<Integer>() {{
add(num);
}};
}
// 将新元素存储到容器中
map.put(num, list);
}
// 返回 容器数据
return map;
}
}
package com.lihaozhe.util;
import org.junit.jupiter.api.Test;
/**
* @author 李昊哲
* @version 1.0.0
*/
public class UtilTest {
@Test
public void test01() {
int[] arr = {1, 2, 3, 3};
System.out.println(Util.fun01(arr));
}
@Test
public void test02() {
int[] arr = {1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5};
System.out.println(Util.fun02(arr));
}
}