Java减少if语句使用:无数组实现选举结果判定方案咨询
解决思路与简洁实现
嘿,这个问题确实有点意思——不能用数组,还要尽量少写if,同时得覆盖所有要求的选举场景。我来给你分享一个既符合规则又简洁的实现方案:
核心规则梳理
先把选举的判定逻辑理清楚,避免后续写冗余代码:
- 直接获胜:某候选人得票超过总票数的50%(注意是“超过”,比如总票100的话,得51才算赢);
- 第二轮场景:
- 4人全进:要么4人得票完全相同,要么出现两组两两并列(比如A=30、B=30、C=20、D=20),且没人得票过半;
- 2人进:要么仅2人得票并列最高且高于其他人,要么最高票仅1人但未过半(此时最高票者+次高票者进第二轮)。
完整代码实现
import java.util.Scanner; public class ElectionResult { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入4名候选人得票数(A、B、C、D) System.out.println("请输入4名候选人的得票数:"); int vA = scanner.nextInt(); int vB = scanner.nextInt(); int vC = scanner.nextInt(); int vD = scanner.nextInt(); scanner.close(); // 计算总票数 int total = vA + vB + vC + vD; // 输出所有候选人得票数 System.out.println("\n候选人得票数统计:"); System.out.println("A: " + vA); System.out.println("B: " + vB); System.out.println("C: " + vC); System.out.println("D: " + vD); // 找出最高票数(只用if,不用数组/工具类) int max = vA; if (vB > max) max = vB; if (vC > max) max = vC; if (vD > max) max = vD; // 统计得最高票的人数 int countMax = 0; if (vA == max) countMax++; if (vB == max) countMax++; if (vC == max) countMax++; if (vD == max) countMax++; // 判断是否有直接获胜者 boolean hasWinner = false; if (max > total / 2 && countMax == 1) { hasWinner = true; System.out.print("获胜者:"); if (vA == max) System.out.println("A"); else if (vB == max) System.out.println("B"); else if (vC == max) System.out.println("C"); else System.out.println("D"); } // 处理第二轮选举情况 if (!hasWinner) { System.out.println("\n需要进行第二轮选举,进入的候选人:"); // 场景1:4人全部进入 boolean isFourWayTie = (countMax == 4) || (countMax == 2 && ((vA == vB && vC == vD && vA != vC) || (vA == vC && vB == vD && vA != vB) || (vA == vD && vB == vC && vA != vB))); if (isFourWayTie) { System.out.println("A、B、C、D"); } // 场景2:仅2人进入 else { // 找出次高票数(只用if) int secondMax = 0; if (vA != max && vA > secondMax) secondMax = vA; if (vB != max && vB > secondMax) secondMax = vB; if (vC != max && vC > secondMax) secondMax = vC; if (vD != max && vD > secondMax) secondMax = vD; // 拼接进入第二轮的候选人名单 String candidates = ""; if (vA == max || vA == secondMax) candidates += "A、"; if (vB == max || vB == secondMax) candidates += "B、"; if (vC == max || vC == secondMax) candidates += "C、"; if (vD == max || vD == secondMax) candidates += "D、"; // 移除最后一个顿号并输出 System.out.println(candidates.substring(0, candidates.length() - 1)); } } } }
代码优化说明
- 严格遵守规则:全程没用到数组,核心逻辑用if实现,仅用了基础的变量和字符串拼接;
- 减少冗余if:先提取最高票、得最高票人数这些关键值,避免重复判断;
- 场景全覆盖:包含了题目要求的2人、4人进第二轮的所有情况,同时处理了最高票仅1人未过半的场景;
- 逻辑清晰:先判断直接获胜,再处理第二轮,代码结构一目了然,后期好维护。
内容的提问来源于stack exchange,提问作者SirPedr
相关产品推荐
相关产品推荐

