如何简化判断四整数至少三个相同的atLeastThreeMatch方法?
简洁实现
atLeastThreeMatch的几种思路 你之前靠罗列所有满足条件的情况实现,确实会显得冗余,这里提供几种更简洁的实现思路,兼顾可读性和代码简洁度:
1. 直接判断所有「三个数相同」的组合
这种方式最直观,代码短小且逻辑清晰:
public static boolean atLeastThreeMatch(int a, int b, int c, int d) { // 覆盖所有三个数相同的场景,四个数全相同的情况会被任意一个条件命中 return (a == b && a == c) || (a == b && a == d) || (a == c && a == d) || (b == c && b == d); }
这里的逻辑很简单:只要存在任意一组三个数相等,就返回true。四个数全部相等的情况自然会被这些条件覆盖(比如a==b==c==d会满足第一个条件a==b && a==c),不需要额外单独判断。
2. 统计数字出现频率
如果以后需要扩展到更多参数(比如5个、6个整数),这种方式的扩展性会更好:
import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.Map; import java.util.function.Function; public static boolean atLeastThreeMatch(int a, int b, int c, int d) { // 用流式API统计每个数字的出现次数 Map<Integer, Long> countMap = Stream.of(a, b, c, d) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); // 检查是否有数字出现次数≥3 return countMap.values().stream().anyMatch(count -> count >= 3); }
这种方式通过流式API统计每个数字的出现频次,只要有一个数字的出现次数达到3次或以上,就返回true。优点是逻辑通用,哪怕参数数量变化,只需要修改Stream的数据源即可。
3. 通过最大值/最小值判断
利用「如果有三个数字相同,那么这三个数字要么是四个数中的最大值,要么是最小值」的逻辑:
public static boolean atLeastThreeMatch(int a, int b, int c, int d) { int max = Math.max(Math.max(a, b), Math.max(c, d)); int min = Math.min(Math.min(a, b), Math.min(c, d)); // 统计最大值出现的次数 int maxCount = (a == max ? 1 : 0) + (b == max ? 1 : 0) + (c == max ? 1 : 0) + (d == max ? 1 : 0); // 统计最小值出现的次数 int minCount = (a == min ? 1 : 0) + (b == min ? 1 : 0) + (c == min ? 1 : 0) + (d == min ? 1 : 0); return maxCount >= 3 || minCount >= 3; }
这个思路的核心是:如果三个数字相同,那么这三个数要么比第四个数大(成为最大值),要么比第四个数小(成为最小值),要么四个数全部相同(此时最大值和最小值相等,次数都是4)。所以只要最大值或最小值的出现次数≥3,就满足条件。
内容的提问来源于stack exchange,提问作者Isaac.
相关产品推荐
相关产品推荐

