每日一题 为了工作 2020 0306 第四题

/**
* 题目: 猫狗队列
* 如题可知 宠物、狗、猫的类已知,试实现一种狗猫队列的结构
* 要求:
* 1.用户可以调用add方法将cat类或dog类的实例放入队列。
* 2.用户可以调用pollAll方法,将队列中的所有实例按照进队列的先后顺序依次弹出。
* 3.用户可以调用pollDog方法,将队列中的dog类的实例按照进队列的先后顺序依次弹出。
* 4.用户可以调用pollCat方法,将队列中的cat类的实例按照进队列的先后顺序依次弹出。
* 5.用户可以调用isEmpty方法,检查队列中是否还有dog或cat的实例。
* 6.用户可以调用isDogEmpty方法,检查队列中是否还有dog类的实例。
* 7.用户可以调用isCatEmpty方法,检查队列中是否还有cat类的实例。
* 分析:
* 本题目实现将不同的实例盖上时间戳的方法,但是又不可以改变用户本身的类,所以定义一个新的类,
* 在构造PetEnterQueue类的时候,pet是用户原有的实例,count就是这个实例的时间戳。
* 我们所实现的队里其实就是PetEnterQueue的实例。大体来说,首先有一个不断累加的数据项,用
* 来表示实例进队列的时间;同时有两个队列,一个只放dog类的实例的队列dogQueue,一个只放cat类的实
* 例的队列catQueue。
* 再加入实例时候,如果实例是dog就盖上时间戳,生成对于的PetEnterQueue类的实例,然后放入
* dogQueue中。cat亦然。
* 只想弹出dog类的实例,只需要在dogQueue中不断弹出即可。cat亦然。
* 若按照实际顺序弹出实例时,因为dogQueue的队列头表示所有dog实例中最早进入队列的实例,catQueue
* 队列的队列头表示最早进入的cat实例,因此,只需要比较这两个队列头的时间戳,谁更早就弹出谁。
*
* @author 雪瞳
*
*/

*代码

public class Pet {
    private  String type;
    public Pet(String type) {
        this.type = type;
    }
    public String getPetType() {
        return this.type;
    }
}
public class Dog extends Pet{
    public Dog() {
        super("dog");
    }
}
public class Cat extends Pet {
    public Cat() {
        super("cat");
    }
}
public class PetEnterQueue {
    private Pet pet;
    private long count;
    
    public PetEnterQueue(Pet pet,long count) {
        this.pet = pet;
        this.count = count;
    }
    
    public Pet getPetType() {
        return this.pet;
    }
    
    public long getPetCount() {
        return this.count;
    }
    
    public String getPetEnterType() {
        return this.pet.getPetType();
    }    
}
import java.util.LinkedList;
import java.util.Queue;

public class DogCatQueue {
    private Queue<PetEnterQueue> dogQueue;
    private Queue<PetEnterQueue> catQueue;
    private long count;
    //实例化猫狗队列对象
    public DogCatQueue() {
        this.dogQueue = new LinkedList<PetEnterQueue>();
        this.catQueue = new LinkedList<PetEnterQueue>();
        this.count = 0;
    }
    //add方法
    public void add(Pet pet) {
        //由于cat、dog都是继承于Pet类,根据向上转型原则,都属于Pet类
        //PetEnterQueue实例作为一个公共的存储对象,根据宠物类别不同存入不同的队列中
        if(pet.getPetType().equals("dog")) {
            //dogQueue队列所存储的是PetEnterQueue的实例 ,count用作计数比较,使用后自增。
            this.dogQueue.add(new PetEnterQueue(pet, this.count++));
            System.out.println("add dog is ok!");
        }else if(pet.getPetType().equals("cat")) {
            this.catQueue.add(new PetEnterQueue(pet, this.count++));
            System.out.println("add cat is ok!");
        }else {
            throw new RuntimeException("error!this pet is not cat or dog!!!");
        }
    }
    //pollAll方法
    public Pet pollAll() {
        if(!dogQueue.isEmpty() && !catQueue.isEmpty()) {
            //都不为空 比较 顶部元素的count时间戳的值 谁小弹出谁
            //Queue.peek()方法可以返回队列的头部元素,也就是相对应的PetEnterQueue实例,在调用该类的getPetCount方法即可获取时间戳
            //Queue.poll()方法可以弹出队列顶部元素
            if(dogQueue.peek().getPetCount()<catQueue.peek().getPetCount()) {
                Pet tip= this.dogQueue.poll().getPetType();
                System.out.println("poll "+tip.getPetType()+"is ok!");
                return tip;
            }else {
                Pet tip =this.catQueue.poll().getPetType();
                System.out.println("poll "+tip.getPetType()+"is ok!");
                return tip;
            }
        }else if(!dogQueue.isEmpty()) {
            //狗队列不为空 猫队列为空
            Pet tip= this.dogQueue.poll().getPetType();
            System.out.println("poll "+tip.getPetType()+"is ok!");
            return tip;
        }else if(!catQueue.isEmpty()){
            Pet tip =this.catQueue.poll().getPetType();
            System.out.println("poll "+tip.getPetType()+"is ok!");
            return tip;
        }else {
            throw new RuntimeException("error!there is no elements!!!");
        }
    }
    public boolean isDogEmpty() {
        if(this.dogQueue.isEmpty()) {
            return true;
        }else {
            return false;
        }
    }
    public boolean isCatEmpty() {
        return this.catQueue.isEmpty();
    }
    public boolean isEmpty() {
        if(this.dogQueue.isEmpty() && this.catQueue.isEmpty()) {
            return true;
        }else {
            return false;
        }
    }
    public Dog pollDog() {
        if(!this.isDogEmpty()) {
            //如果还有元素
            //返回的是String类型 必须强制转型Dog
            return (Dog) this.dogQueue.poll().getPetType();
        }else {
            throw new RuntimeException("error!the dogQueue is empty!!!");
        }
    }
    public Cat pollcat() {
        if(!this.isCatEmpty()) {
            return (Cat) this.catQueue.poll().getPetType();
        }else {
            throw new RuntimeException("error!the catQueue is empty!!!");
        }
    }
}
import java.util.Random;

public class TestDogAndCatQueue {
    public static void main(String[] args) {
        //实例化对象
        DogCatQueue test = new DogCatQueue();
        Dog dog = new Dog();
        Cat cat = new Cat();
        Pet pet[] = new Pet[] {dog,cat};
        Random rand = new Random();
        int tip = 0;
        //获取十组测试对象
        for(int i=0;i<10;i++) {
            test.add(pet[rand.nextInt(2)]);
        }
        System.out.println("*********add is ok!*********");
        for(int i=0;i<10;i++) {
            test.pollAll();
        }
        System.out.println("*********poll is ok!*********");
    }
}

 

posted @ 2020-03-06 13:35  雪瞳  阅读(177)  评论(0编辑  收藏  举报