背景
我们现在在做一个周汇报的系统,每周抽取制定人数进行汇报,选中人进行投票,本次汇报谁的内容最好,谁的内容不佳。
思路
把每个学员投的票进行汇总,然后统计分数。
1,把投票的排名对应成分数,
例子: 比如昊天投票的结果如下:
1,张三
2,李四
3,王五
4,甲
5,乙
6,丙
那么张三就是1分,李四2分,以此类推最后丙的分数6分
2,汇总所有分数,分数越低的用户排名越高。
3,设计二维数组,蓝色左边为参加汇报的成员id,红色上面为投票成员的id,绿色框起来的为总分
实现
1,假设选中了六个人进行汇报。我们的二维数组就要设计为7行8列,因为起始列为成员的id,最后一列为总分,起始行为投票成员的id(看上图)。
List<User> users = new ArrayList<>();
//初始化六个用户
for (int i = 1 ; i < 7 ; i++) {
User user = new User();
user.setId((long) i);
user.setName(String.format("张%d", i));
user.setRank(1);//每个人都排第一
users.add(user);
}
//存放 用户id得值
Long[] ids = new Long[users.size() + 1];
int length = users.size() + 1;
int p = 0;
for (User user: users) { //拿到所有用户id的值赋给ids数组
ids[p++] = user.getId();
}
ids[p] = 0L;//总分
//创建7行8列的二维数组
int[][] tickets = new int[length][length+1];
for (int i = 0 ; i < length ; i++)
{
for (int j = 0 ; j <= length ; j++) {
if (i == 0 && j != 0) {
tickets[i][j] = Math.toIntExact(ids[j - 1]);
}
if (j == 0 && i != 0) {
tickets[i][j] = Math.toIntExact(ids[i - 1]);
}
System.out.print(tickets[i][j]+ " ");
}
System.out.println();
}
2,现在模拟投票的成员进行了投票
/**
* 假设最终的投票结果如下
*/
tickets[1][1] = 2; tickets[2][1] = 1; tickets[3][1] = 6; tickets[4][1] = 5; tickets[5][1] = 3; tickets[6][1] = 4;
tickets[1][2] = 4; tickets[2][2] = 2; tickets[3][2] = 3; tickets[4][2] = 6; tickets[5][2] = 1; tickets[6][2] = 5;
tickets[1][3] = 2; tickets[2][3] = 1; tickets[3][3] = 6; tickets[4][3] = 5; tickets[5][3] = 3; tickets[6][3] = 4;
tickets[1][4] = 3; tickets[2][4] = 5; tickets[3][4] = 4; tickets[4][4] = 6; tickets[5][4] = 2; tickets[6][4] = 1;
tickets[1][5] = 1; tickets[2][5] = 2; tickets[3][5] = 3; tickets[4][5] = 4; tickets[5][5] = 5; tickets[6][5] = 6;
tickets[1][6] = 2; tickets[2][6] = 4; tickets[3][6] = 6; tickets[4][6] = 3; tickets[5][6] = 1; tickets[6][6] = 5;
3,统计总分后,效果如下
4,根据最小值进行排名:
for (int z = 1 ; z < length ; z++) {//排名
int i = 1;
int min = tickets[i][length];//设置第一值为最小的值
for (; i < length; i++) { //找到最小值
if (tickets[i][length] < min && tickets[i][length] != 0) {
min = tickets[i][length];
}
}
for (i = 1; i < length; i++) {
if (tickets[i][length] == min) {
int finalI = i;
int finalZ = z;
int finalY = i;
users.stream()
.filter(user -> user.getId() == tickets[finalI][0])
.findAny()
.ifPresent(user -> user.setRank(finalZ));
for (; finalY < length - 1; finalY++) {
for (int j = 0; j <= length; j++ ) { //删除已经进行排名过的用户。
tickets[finalY][j] = tickets[finalY+1][j];
}
}
for (int j = 0; j <= length; j++ ) {//填充最后相同的数据为零
tickets[finalY][j] = 0;
}
}
}
}
5,结果:
总结
这样完成了排名效果,但维护性不强,多次用到for和if很容易乱。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。