投票统计程序优化:仅显示非零票数的排名结果
投票程序优化方案:仅显示非零票数的排名
问题分析
你当前的核心问题是:程序会强制输出第一、第二、第三名的标题及结果,哪怕对应排名的票数为0;同时把显示逻辑塞进循环后导致重复输出。要解决的两个核心点是:过滤掉票数为0的无效排名,并且给每个有效排名只输出一次对应标题。
解决思路
- 先收集所有候选人的票数数据,过滤掉票数为0的条目
- 对剩下的有效候选人按票数降序排序
- 遍历排序后的列表,只取前3名,根据当前遍历的位置生成对应排名标题,逐一输出即可
代码示例
假设你原有代码的简化结构如下,以下是优化后的完整代码:
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; class Candidate { String name; int votes; public Candidate(String name, int votes) { this.name = name; this.votes = votes; } } public class VotingApp { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); List<Candidate> candidates = new ArrayList<>(); // 引导用户输入候选人票数(这里以3个候选人为例,可扩展为动态输入) System.out.println("输入候选人A的票数:"); candidates.add(new Candidate("A", scanner.nextInt())); System.out.println("输入候选人B的票数:"); candidates.add(new Candidate("B", scanner.nextInt())); System.out.println("输入候选人C的票数:"); candidates.add(new Candidate("C", scanner.nextInt())); // 过滤票数为0的候选人,按票数降序排序 List<Candidate> validCandidates = new ArrayList<>(); for (Candidate c : candidates) { if (c.votes > 0) { validCandidates.add(c); } } Collections.sort(validCandidates, (a, b) -> Integer.compare(b.votes, a.votes)); // 输出有效排名(最多显示前三) for (int i = 0; i < validCandidates.size() && i < 3; i++) { Candidate current = validCandidates.get(i); String rankTitle; switch (i) { case 0: rankTitle = "第一名"; break; case 1: rankTitle = "第二名"; break; case 2: rankTitle = "第三名"; break; default: rankTitle = ""; } System.out.println("=== " + rankTitle + " ==="); System.out.println("候选人:" + current.name + ",票数:" + current.votes); } scanner.close(); } }
效果对比
- 原问题输出(比如B、C票数为0时):
=== 第一名 ===
候选人:A,票数:10
=== 第二名 ===
候选人:B,票数:0
=== 第三名 ===
候选人:C,票数:0
- 优化后输出:
=== 第一名 ===
候选人:A,票数:10
若有两个有效票数(A10、B5、C0),输出:
=== 第一名 ===
候选人:A,票数:10
=== 第二名 ===
候选人:B,票数:5
关键说明
- 用
validCandidates列表过滤掉票数为0的候选人,直接排除无效排名 - 通过
i < 3限制最多显示前三名,符合需求 - 循环内通过索引
i生成对应排名标题,每个有效排名只输出一次标题,彻底解决重复输出问题
内容的提问来源于stack exchange,提问作者user20758216
相关产品推荐
相关产品推荐

