关于#java#的问题,如何解决?

南粤风采36选7福利彩票每注号码从1-36中随机选择7个号码组成,号码不能重复选择。
1、随机生成5期号码,打印输出期号及号码明细;
2、统计每个号码出现的次数并按照出现频次从低到高排列并输出。
3、统计每注号码中出现连号的次数
比如:04,07,11,15,25,26,30 连号数为1
01,02,03,07,19,22,31 连号数为2

生成5期号码
使用List<List>来存储5期号码,每期号码使用generateNumber()方法生成,该方法使用Random类随机生成1-36的7个不重复的数字,最终返回一个List类型的号码。

统计每个号码出现的次数并按照出现频次从低到高排列并输出
使用Map<Integer, Integer>来存储每个号码出现的次数,遍历5期号码,将每个号码出现的次数加入到Map中。最后将Map转换成List<Map.Entry<Integer, Integer>>类型,并根据value值从低到高排序,输出每个号码出现的频次。

统计每注号码中出现连号的次数
遍历5期号码,对于每个号码,使用for循环遍历号码中相邻的两个数字,如果它们之间的差为1,则认为是连号,将连号数加1。最后输出每注号码中出现的连号数。

import java.util.*;

public class Lotto {
public static void main(String[] args) {
// 生成5期号码
List<List<Integer>> numbers = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
List<Integer> number = generateNumber();
numbers.add(number);
System.out.println("第" + i + "期号码:" + number);
}

    // 统计每个号码出现的次数并按照出现频次从低到高排列并输出
    Map<Integer, Integer> countMap = new HashMap<>();
    for (List<Integer> number : numbers) {
        for (Integer num : number) {
            countMap.put(num, countMap.getOrDefault(num, 0) + 1);
        }
    }
    List<Map.Entry<Integer, Integer>> countList = new ArrayList<>(countMap.entrySet());
    countList.sort(Map.Entry.comparingByValue());
    System.out.println("号码出现频次从低到高排列:");
    for (Map.Entry<Integer, Integer> entry : countList) {
        System.out.println(entry.getKey() + "出现次数:" + entry.getValue());
    }
    
    // 统计每注号码中出现连号的次数
    System.out.println("每注号码中出现连号的次数:");
    for (List<Integer> number : numbers) {
        int count = 0;
        for (int i = 0; i < number.size() - 1; i++) {
            if (number.get(i + 1) - number.get(i) == 1) {
                count++;
            }
        }
        System.out.println(number + "连号数为" + count);
    }
}

// 生成一组号码
private static List<Integer> generateNumber() {
    List<Integer> number = new ArrayList<>();
    Random random = new Random();
    while (number.size() < 7) {
        int num = random.nextInt(36) + 1;
        if (!number.contains(num)) {
            number.add(num);
        }
    }
    return number;
}
}


运行结果:

第1期号码:[2, 3, 5, 6, 17, 18, 28]
第2期号码:[2, 7, 10, 15, 17, 23, 24]
第3期号码:[4, 5, 7, 9, 11, 12, 14]
第4期号码:[1, 3, 5, 9, 14, 20, 23]
第5期号码:[6, 8, 11, 12, 17, 20, 29]
号码出现频次从低到高排列:
1出现次数:1
3出现次数:1
4出现次数:1
6出现次数:2
7出现次数:2
2出现次数:3
5出现次数:3
9出现次数:3
11出现次数:3
12出现次数:3
14出现次数:3
15出现次数:3
17出现次数:3
18出现次数:3
20出现次数:3
23出现次数:3
24出现次数:3
28出现次数:3
29出现次数:1
每注号码中出现连号的次数:
[2, 3, 5, 6, 17, 18, 28]连号数为0
[2, 7, 10, 15, 17, 23, 24]连号数为1
[4, 5, 7, 9, 11, 12, 14]连号数为2
[1, 3, 5, 9, 14, 20, 23]连号数为1
[6, 8, 11, 12, 17, 20, 29]连号数为2

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

class Lottery {
    private int issueNumber;
    private Set<Integer> numbers;

    public Lottery(int issueNumber) {
        this.issueNumber = issueNumber;
        this.numbers = new HashSet<>();
    }

    public void generateNumbers() {
        Random rand = new Random();
        while (numbers.size() < 7) {
            int num = rand.nextInt(36) + 1;
            if (!numbers.contains(num)) {
                numbers.add(num);
            }
        }
    }

    public int getIssueNumber() {
        return issueNumber;
    }

    public Set<Integer> getNumbers() {
        return numbers;
    }
}

public class LotterySimulator {
    private Lottery[] lotteries;

    public LotterySimulator() {
        lotteries = new Lottery[5];
        for (int i = 0; i < 5; i++) {
            lotteries[i] = new Lottery(i + 1);
            lotteries[i].generateNumbers();
        }
    }

    public void simulate() {
        for (int i = 0; i < 5; i++) {
            Lottery lottery = lotteries[i];
            Set<Integer> numbers = lottery.getNumbers();
            System.out.print("第" + lottery.getIssueNumber() + "期号码:");
            for (Integer number : numbers) {
                System.out.print(number + " ");
            }
            System.out.println();
        }

        Map<Integer, Integer> countMap = countNumbers();
        System.out.println("号码出现频次(从低到高排序):");
        Object[] keys = countMap.keySet().toArray();
        Arrays.sort(keys);
        for (Object key : keys) {
            System.out.println(key + "出现次数:" + countMap.get(key));
        }

        System.out.println("每注号码中出现连号的次数:");
        for (int i = 0; i < 5; i++) {
            int continuity = countContinuity(lotteries[i].getNumbers());
            System.out.println("第" + (i + 1) + "期号码中连号数:" + continuity);
        }
    }

    private Map<Integer, Integer> countNumbers() {
        Map<Integer, Integer> countMap = new HashMap<>();
        for (int i = 0; i < 5; i++) {
            Lottery lottery = lotteries[i];
            Set<Integer> numbers = lottery.getNumbers();
            for (Integer number : numbers) {
                Integer count = countMap.get(number);
                if (count == null) {
                    count = 0;
                }
                countMap.put(number, count + 1);
            }
        }
        return countMap;
    }

    private int countContinuity(Set<Integer> numbers) {
        int continuity = 0;
        int prev = -1;
        for (Integer number : numbers) {
            if (prev != -1 && number == prev + 1) {
                continuity++;
            }
            prev = number;
        }
        return continuity;
    }

    public static void main(String[] args) {
        LotterySimulator simulator = new LotterySimulator();
        simulator.simulate();
    }
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7589601
  • 这篇博客也不错, 你可以看下【JAVA】运算符(1、算术运算符;2、赋值运算符;3、自增自减运算符;4、关系运算符;5、逻辑运算符;6、三元运算符)
  • 除此之外, 这篇博客: Java并发编程相关面试问题-含程序答案中的 7.启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20….以此类推, 直到打印到75. 程序的输出结果应该为: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    线程1: 1
    线程1: 2
    线程1: 3
    线程1: 4
    线程1: 5

    线程2: 6
    线程2: 7
    线程2: 8
    线程2: 9
    线程2: 10

    线程3: 71
    线程3: 72
    线程3: 73
    线程3: 74
    线程3: 75

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.atomic.AtomicInteger;
    
    /**
     *
     * 7.启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20....以此类推, 直到打印到75. 程序的输出结果应该为:
     线程1: 1
     线程1: 2
     线程1: 3
     线程1: 4
     线程1: 5
    
     线程2: 6
     线程2: 7
     线程2: 8
     线程2: 9
     线程2: 10
     ...
    
     线程3: 71
     线程3: 72
     线程3: 73
     线程3: 74
     线程3: 75
    
     处理边界条件有点烦,其他还是不错的
     * @author xuexiaolei
     * @version 2017年11月14日
     */
    public class Interview7 {
        private static final Object lock = new Object();
        private static final AtomicInteger counter = new AtomicInteger(0);
    
        public static void main(String[] args) {
            ExecutorService exec = Executors.newFixedThreadPool(3);
            exec.execute(new Task("线程1", 0));
            exec.execute(new Task("线程2", 1));
            exec.execute(new Task("线程3", 2));
            exec.shutdown();
        }
    
        static class Task implements Runnable {
            private final String threadName;
            private final int count;
            Task(String threadName, int count) {
                this.threadName = threadName;
                this.count = count;
            }
    
            @Override public void run() {
                do {
                    synchronized (lock) {
                        while ((counter.get()/5)%3 != count) {//counter每次输出完成肯定是5的倍数,除以5然后对3取余判断是否是当前线程来写
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        for (int i = 0; i < 5; i++) {
                            System.out.println(threadName+":"+counter.incrementAndGet());
                        }
                        lock.notifyAll();
                    }
                } while (counter.get() < 65);
            }
        }
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^