·题目内容:

请实现以下抽奖的需求:

  1. 有30个候选人进行抽奖
  2. 抽出一等奖1名,二等奖3名,三等奖5名
  3. 把得奖名单分别按一、二、三等奖存储起来
  4. 同一人只能获奖一次
  5. 控制台打印得奖名单

基本要求为:

  1. 利用Redis类型的特性,进行选型
  2. 代码排版良好,阅读性强
  3. 使用编程语言结合Redis实现
  4. 命令使用准确
  5. 得奖名单存储规范

·需求分析:

请实现以下抽奖的需求:

  1. 有30个候选人进行抽奖,同一人只能获奖一次,控制台打印得奖名单
    分析: 使用redis中的set数据结构存储30名候选人,利用set集合存储的随机性,可利用set集合中的spop方法实现随机取出候选人且永不重复的功能——即随机抽奖。
  2. 抽出一等奖1名,二等奖3名,三等奖5名
    分析: 利用if条件判断,规定一等奖抽出1名,二等奖抽出3名,三等奖抽出5名
  3. 把得奖名单分别按一、二、三等奖存储起来
    分析: 使用redis中的hashmap数据结构,利用hashmap中的hset方法和hget方法可以实现存储与读取获奖者信息。同时hashmap的的hget方法只会获取值,不会因为取出而无法进行二次查询。

具体代码:

package com.company;

import redis.clients.jedis.*;
import java.util.ArrayList;

public class Main {
    final static String host = new String("localhost");
    final static int port = 6379;
    final static String Lottery = "0233Redis:Sets:id:lottery";
    final static String Winner = "0233Redis:HashMap:Winner:id";
    final static String Winner_First = "0233Redis:HashMap:id01:01";
    final static String Winner_Second = "0233Redis:HashMap:id02:02";
    final static String Winner_Third = "0233Redis:HashMap:id03:03";
    static Jedis jedis = new Jedis(host,port);

    public static void main(String[] args) {
        //CleanAll();
        SetName(30);
        GetName();
        //ShowAll();
        /*
        Redis变量命名规范:
        1) 第一段放置项目名或缩写 如 project
        1) 第二段把表名转换为key前缀 如, user:
        2) 第三段放置用于区分区key的字段,对应mysql中的主键的列名,如userid
        3) 第四段放置主键值,如18,16
        */
    }

    //设定候选人
    static void SetName(int x){
        for(int i=1;i<=x;i++){
            jedis.sadd(Lottery,"候选人"+Integer.toString(i));
        }
        System.out.println("候选人登记完毕!");
    }

    //抽奖过程
    static void GetName(){
        //temp_1:记录一二三等奖的中文形式
        //temp_2:接收一个从set中取出的随机名字
        //temp_4:记录获奖组的key值
        //y:规定每一组获奖者的人数
        System.out.println("所有参加抽奖的候选人"+jedis.smembers(Lottery));
        String temp_1,temp_2,temp_4 = null;
        int y;
        //创建一个数组来存储每组获奖者
        ArrayList arr = new ArrayList(5);
        for(int j=1;j<=3;j++)
        {
            if(j==1){temp_1="一等奖";y=1;temp_4=Winner_First;}
            else if(j==2){temp_1="二等奖";y=3;temp_4=Winner_Second;}
            else {temp_1="三等奖";y=5;temp_4=Winner_Third;}
            System.out.print(temp_1+"获得者是:");
            for(int i=0;i<y;i++){
                temp_2 = jedis.spop(Lottery);
                if(temp_2==null) {
                    System.out.println(temp_1+"数据为空!");
                    return ;
                }
                arr.add(temp_2);
                System.out.print(temp_2+" ");
            }
            //用hashmap存储每一组获奖者
            jedis.hset(Winner,temp_4, String.valueOf(arr));
            //每存储完一组获奖者,数组都需要清空,来记录下一组获奖者
            arr.clear();
            System.out.print("\n");
        }
    }

    //清空所有数据结构,测试用
    static void CleanAll(){
        jedis.del(Lottery);
        jedis.del(Winner);
        System.out.println("清理完成");
    }

    //展示存储情况,测试用
    static void ShowAll(){
        //temp_3:表示从链表中接收的弹出的数据
        //temp_5:接收一二三等奖链表的名称
        String temp_3,temp_5;
        for(int j=1;j<=3;j++)
        {
            if(j==1){
                temp_5=Winner_First;
                System.out.println("一等奖获取者是:");}
            else if(j==2){
                temp_5=Winner_Second;
                System.out.println("二等奖获取者是:");}
            else {
                temp_5=Winner_Third;
                System.out.println("三等奖获取者是:");}

            System.out.println(jedis.hget(Winner,temp_5));
        }

    }
}

代码还不够美观,方法都是静态的,被老师批过,其他没啥问题

手动高亮:仅供参考学习,请勿照搬
欢迎讨论

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐