投票选举
(1)功能描述
有一个半采用*投票的方法推选班长,班长候选人共4位,每个人姓名以及代号分别为“张三 1,李四 2,王五 3,赵六 4”。
程序操作员将每张选票上所填的代号(1、2、3、4)循环输入电脑,输入数字0结束输,然后将所有候选人的得分情况显示出来,并显示最终当选者结果。
(2)具体要求
- 要求用面向对象方法,编写学生类Student,将候选人姓名、代号与票数保存到类Student中,并实现相应的get与set方法。
- 输入数据前,显示出各候选人代号,知直到输入的数字为0,结束选票输入工作。
- 在接收每次输入的选票后要求验证该选票是否有效,即如果输入的数不是0、1、2、3、4、5之间的数字,则选票无效,提示错误信息并继续输入。
- 输入结束后显示所有候选人的得票情况,如参考样例。
- 输出最终当选择和的相关信息,如参样例所示。
(3)参考样例
- 张三【0】票
- 李四【0】票
- 王五【0】票
- 赵六【0】票
请输入班长候选人代号(数字0结束):
1
请输入班长候选人代号(数字0结束):
1
请输入班长候选人代号(数字0结束):
7
您输入有误,请重新输入:
0
结果:
- 张三【2】票
- 李四【0】票
- 王五【0】票
- 赵六【0】票
投票结果:恭喜张三同学最后以2票当选班长!
程序实现:
- 建立学生类,这个类里面需要保存有编号、姓名、票数
package com.io.demo.vo; public class Student implements Comparable<Student>{ private long id; private String name; private int vote; //票数 public Student(long id,String name,int vote) { this.id = id; this.name = name; this.vote =vote; } @Override public int compareTo(Student o) { return o.vote - this.vote; } public String toString() { return "代号:"+this.id+"、姓名:" + this.name +"、票数:"+this.vote; } //setter、getter public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getVote() { return vote; } public void setVote(int vote) { this.vote = vote; } }
- 定义投票处理的业务接口
package com.io.demo.service; import com.io.demo.vo.Student; public interface IVoteService { public boolean inc(long id); //根据编号进行增长 public Student[] result(); //获取投票的结果 public Student[] getData(); //获取全部数据 }
-
定义VoteServiceImpl子类实现方法
package com.io.demo.serviceImpl; import java.util.Arrays; import com.io.demo.service.IVoteService; import com.io.demo.vo.Student; public class VoteServiceImpl implements IVoteService{ private Student[] students = new Student[] {new Student(1,"张三",0), new Student(2,"李四",0), new Student(3,"王五",0), new Student(4,"赵六",0)}; @Override public boolean inc(long id) { for(int x = 0;x < students.length;x++) { if(students[x].getId() == id) { //获取了指定的编号 this.students[x].setVote(this.students[x].getVote()+1); //票数增长 return true; } } return false; } @Override public Student[] result() { Arrays.sort(this.students); return this.students; } @Override public Student[] getData() { return this.students; } }
-
定义工厂类
package com.io.demo.factory; import com.io.demo.service.IVoteService; import com.io.demo.serviceImpl.VoteServiceImpl; public class Factory { private Factory() {} public static IVoteService getInstance() { return new VoteServiceImpl(); } }
-
定义一个输入工具类
package com.io.demo.InputUtil; import java.util.Scanner; public class InputUtil { private InputUtil() {} /** * 实现键盘输入数字的操作 * @param prompt 提示信息 * @return 一个可以使用的数字 */ public static int getInt(String prompt) { int num = 0; boolean flag = true; Scanner input; while(flag) { input = new Scanner(System.in); System.out.print(prompt); //打印提示信息 if(input.hasNext("\\d+")){ num = Integer.parseInt(input.next("\\d+")); //记录数据 flag = false; }else{ System.out.println("输入的内容不是数据"); } } return num; } }
-
定义一个菜单显示类
package com.io.demo.menu; import com.io.demo.InputUtil.InputUtil; import com.io.demo.factory.Factory; import com.io.demo.service.IVoteService; import com.io.demo.vo.Student; public class Menu { private IVoteService voteService; public Menu() { this.voteService = Factory.getInstance(); this.vote(); } private void vote() { //投票处理 //获取数据并输出 Student[] stu = this.voteService.getData(); for(Student temp : stu) { System.out.println(temp); } //对票数进行统计 int num = 10; while(num != 0) { //循环投票 num = InputUtil.getInt("请输入投票数据(0表示结束):"); if(num != 0) { if(!this.voteService.inc(num)) { //根据Id增长票数,如果返回是false则提示错误信息 System.out.println("此票无效,请重新输入!"); } } } System.out.println("投票最终结果:"); stu = this.voteService.result(); //对结果进行排序 System.out.println("恭喜"+stu[0].getName()+"同学以"+stu[0].getVote()+"票获取班长职位!"); } }
-
定义测试类
package com.io.demo; import com.io.demo.menu.Menu; public class Demo { public static void main(String[] args) { new Menu(); } }