1

背景

我们现在在做一个周汇报的系统,每周抽取制定人数进行汇报,选中人进行投票,本次汇报谁的内容最好,谁的内容不佳。

思路

把每个学员投的票进行汇总,然后统计分数。
1,把投票的排名对应成分数,

例子: 比如昊天投票的结果如下:
1,张三
2,李四
3,王五
4,甲
5,乙
6,丙

那么张三就是1分,李四2分,以此类推最后丙的分数6分

2,汇总所有分数,分数越低的用户排名越高。

3,设计二维数组,蓝色左边为参加汇报的成员id,红色上面为投票成员的id,绿色框起来的为总分
image.png

实现

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,统计总分后,效果如下
image.png

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,结果:
image.png

image.png

总结

这样完成了排名效果,但维护性不强,多次用到for和if很容易乱。


zZ_jie
436 声望9 粉丝

虚心接受问题,砥砺前行。