java基础练习题

1.需求:定义一个方法,找出int数组中,最大值的索引下标

 //定义一个方法 找出int数组中最大值的索引下标
        int [] l1 = {23,45,56,67,78545};
        Max(l1);//4
        int [] l2 = {34,65656,6778,89};
        Max(l2);//1
    }
    public  static  void Max(int [] arr ) {
        int maxIndex = 0; //最大值的索引的一个变量
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > arr[maxIndex]) {
                maxIndex = i;
            }
        }
        System.out.println(maxIndex);
    }

2.在指定的int数组中找出指定的数据的下标

    public static void main(String[] args) {
      //  在指定的int数组中找出指定的数据的下标
        int [] arr = {34,45,56,677,5,78};
        int index = indexOf(arr,5);
        System.out.println(index);
    }
    public  static  int  indexOf(int [] arr, int found){
        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == found){
                index = i;
                break;
            }
        }
        return index;
    }

3.List集合斗地主案例

public class Test1 {
    public static void main(String[] args) {
        /**
         * List集合案例:按照斗地主的规则,完成洗牌发牌的动作。
         * 具体规则:
         *      使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张,最后三张留作底牌;
         *      案例分析:准备牌:花色与数字集合组成一张牌。使用Collections类shuffle方法进行随机排序;
         *      发牌:将牌依次发给三个人,留下底牌三张
         *      看牌:直接打印每人手里的牌,和底牌
         */
        //1.创建一个集合数组当成牌盒子
        List<String> Pai = new ArrayList<>();

        //2.准备牌
        String [] str = {"♥️" , "♠️" ,"♣️" ,"♦️"};
        for (int i = 0; i < str.length; i++) {
            for (int j = 2; j < 11 ; j++) {
                Pai.add(str[i] + j+ " ");
            }
        }
//        for (String ss:Pai) {
//            System.out.println(ss);
//        }
        String [] str1 = {"A","J","Q","K"};
        for (int i = 0; i < str.length; i++) {
            for (int j = 0; j < str1.length; j++) {
                Pai.add(str[i] + str1[j]);
            }
        }
//        for (String ss:Pai) {
//            System.out.println(ss);
//        }

        Pai.add("大王");
        Pai.add("小王");
        //打错顺序
        Collections.shuffle(Pai);
//        for (String ss:Pai) {
//            System.out.println(ss);
//        }

        //3.定义三个玩家
        ArrayList<String> play1 = new ArrayList<>();
        ArrayList<String> play2 = new ArrayList<>();
        ArrayList<String> play3 = new ArrayList<>();
        ArrayList<String> diPai = new ArrayList<>();

        //4.遍历牌
        for (int i = 0; i < Pai.size(); i++) {
            String card = Pai.get(i);
            //  留三张底牌
            if ( i >= 51){  //余三张存到底牌中
                diPai.add(card);
            }else {
                //发给三个人 集合  依次发牌
                if (i % 3 == 0){
                    play1.add(card);
                }else if (i % 3 == 1){
                    play2.add(card);
                }else {
                    play3.add(card);
                }
            }
        }
        //看牌
        System.out.println("玩家1"+play1);
        System.out.println("玩家2"+play2);
        System.out.println("玩家3"+play3);
        System.out.println("底牌" + diPai);
    }
}

4.需求:4个景点 80人投票 统计投票人数

public class Test5 {
    public static void main(String[] args) {
        //1.把80个学生选择的数据拿进来
        String [] selects  = {"A","B","C","D"};
        StringBuilder sb = new StringBuilder();
        Random r = new Random();
        for (int i = 0; i <80 ; i++) {
            sb.append(selects[r.nextInt(selects.length)]);
        }
        //2.定义一个Map集合记录最终结果
        Map<Character,Integer> infos = new HashMap<>();
        //3.遍历80个学生选择的数据
        for (int i = 0; i < sb.length(); i++) {
            //4.提取当前选择景点的字符
            char ch = sb.charAt(i);
            //5.判断Map集合中是否存在这个键
            if(infos.containsKey(ch)){
                infos.put(ch,infos.get(ch)+1);
            }else {
                infos.put(ch,1);
            }
        }
        //4.输出集合
        System.out.println(infos);
    }
}

5.生产者消费者模式

public class Test3 {
    public static void main(String[] args) throws InterruptedException {
            // 生产消费者模式
        Goods goods =new Goods("保时捷", 67.8,true);   //true需要被生产
        Customer customer  =new Customer(goods);
        Producer producer = new Producer(goods);
        new Thread(customer).start();
        new Thread(producer).start();
    }
}

//1.共享资源对象 两个线程同时操作
class Goods{
    private  String name;//商品名字
    private double price;//商品价格
    private boolean shouldProduct;//没有商品为true

    public Goods() {
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                ", shouldProduct=" + shouldProduct +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public boolean isShouldProduct() {
        return shouldProduct;
    }

    public void setShouldProduct(boolean shouldProduct) {
        this.shouldProduct = shouldProduct;
    }

    public Goods(String name, double price, boolean shouldProduct) {
        this.name = name;
        this.price = price;
        this.shouldProduct = shouldProduct;
    }
}

//2 .写两个线程
//  消费者线程
class Customer implements Runnable{
    //由于两个线程需要共享一个资源
    private Goods goods;
    public Customer(Goods goods){
        this.goods = goods;
    }
    @Override
    public void run() {
        //消费多个 无限制消费
        while (true){
//            try {
//                Thread.sleep(3000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
            synchronized (goods){
                //  执行不需要生产的代码
                if (!goods.isShouldProduct()){
                    System.out.println("消费者购买了:" + goods.getName()+ ",价格为:" + goods.getPrice());
                    //购买完以后商品没了 需要标记为true
                    goods.setShouldProduct(true);
                    //唤醒生产者
                    goods.notify();
                }else{
                    //需要生产  消费者需要等待
                    try {
                        //  没有商品 需要生产 消费者进入阻塞状态
                        goods.wait();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

//  生产者线程
class Producer  implements Runnable{
    private Goods goods;
    public Producer(Goods goods){
        this.goods = goods;
    }
    @Override
    public void run() {
        int count = 0;
        while (true){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (goods){
                if (goods.isShouldProduct()){
                    if (count  %2 ==0 ){
                        goods.setName("奥迪R9");
                        goods.setPrice(54.9);
                    }else {
                        goods.setName("五菱");
                        goods.setPrice(16.8);
                    }
                    //  生产完以后 标记生产状态为false
                    goods.setShouldProduct(false);
                    System.out.println("生产者生产了:" + goods.getName()+",价格为:"+goods.getPrice());
                    count++;
                    //唤醒消费者 让他去消费
                    goods.notify();
                }else {
                    //有车不需要生产 生产者等待
                    try {
                        goods.wait();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

上一篇:PIX自动驾驶开发套件助力清华大学科技攻关与教学


下一篇:MySQL乐观锁电商库存并发问题应用