week 4:猫狗队列

topic requirement:

宠物、狗和猫的类如下:

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");
          }
}

实现一个猫狗队列,要求如下:

  1.可以调用add()方法,将cat类和dog类添加到队列中;

  2.可以调用pollAll()方法,将队列中的所有实例按入队列的顺序依次弹出;

  3.可以调用pollCat()方法,将队列中的所有Cat对象实例按入队列的顺序依次弹出;

  4.可以调用pollDog()方法,将队列中的所有Dog对象实例按入队列的顺序依次弹出;

  5.可以调用isEmpty()方法,判断对队列是否为空;

  6.可以调用isCatEmpty()方法,判断队列是否有Cat对象实例;

  7.可以调用isDogEmpty()方法,判断队列是否有Dog对象实例;

thoughts:

队列是先进先出,由于要存放两种不同的对象,因此可以用两个队列分别存放Dog对象和Cat对象。由于要维持进入队列的顺序,
在不改变原有类的情况下,我们可以构造一个类EnterPetQueue,在类中引入计数变量,来记录对象的入队顺序。

public class DogCatQueue1 {

	public static class Pet {
		private String type;

		public Pet(String type) {
			this.type = type;
		}

		public String getPetType() {
			return this.type;
		}
	}

	public static class Dog extends Pet {
		public Dog() {
			super("dog");
		}
	}

	public static class Cat extends Pet {
		public Cat() {
			super("cat");
		}
	}

	public static class PetEnterQueue {
		private Pet pet;      
		private long count;  

		public PetEnterQueue(Pet pet, long count) {
			this.pet = pet;
			this.count = count;
		}

		public Pet getPet() {
			return this.pet;
		}

		public long getCount() {
			return this.count;
		}

		public String getEnterPetType() {
			return this.pet.getPetType();
		}
	}

	public static class DogCatQueue {
		private Queue<PetEnterQueue> dogQ;  
		private Queue<PetEnterQueue> catQ;
		private long count; 


		public DogCatQueue() {
			this.dogQ = new LinkedList<PetEnterQueue>();
			this.catQ = new LinkedList<PetEnterQueue>();
			this.count = 0;
		}

		public void add(Pet pet) {  
			if (pet.getPetType().equals("dog")) {
				this.dogQ.add(new PetEnterQueue(pet, this.count++)); 
			} else if (pet.getPetType().equals("cat")) {
				this.catQ.add(new PetEnterQueue(pet, this.count++));
			} else {
				throw new RuntimeException("err, not dog or cat");
			}
		}

		public Pet pollAll() {
			if (!this.dogQ.isEmpty() && !this.catQ.isEmpty()) {
				if (this.dogQ.peek().getCount() < this.catQ.peek().getCount()) {
					return this.dogQ.poll().getPet();
				} else {
					return this.catQ.poll().getPet();
				}
			} else if (!this.dogQ.isEmpty()) {//cat empty
				return this.dogQ.poll().getPet(); 
			} else if (!this.catQ.isEmpty()) {  //dog empty
				return this.catQ.poll().getPet();
			} else {
				throw new RuntimeException("err, queue is empty!");
			}
		}

		public Dog pollDog() {//弹出
			if (!this.isDogQueueEmpty()) { //狗队列不为空,弹出即可
				return (Dog) this.dogQ.poll().getPet();
			} else {
				throw new RuntimeException("Dog queue is empty!");
			}
		}

		public Cat pollCat() {
			if (!this.isCatQueueEmpty()) {
				return (Cat) this.catQ.poll().getPet();
			} else
				throw new RuntimeException("Cat queue is empty!");
		}

		public boolean isEmpty() {
			return this.dogQ.isEmpty() && this.catQ.isEmpty();
		}

		public boolean isDogQueueEmpty() {
			return this.dogQ.isEmpty();
		}

		public boolean isCatQueueEmpty() {
			return this.catQ.isEmpty();
		}

	}

	public static void main(String[] args) {
		DogCatQueue test = new DogCatQueue();

		Pet dog1 = new Dog();
		Pet cat1 = new Cat();
		Pet dog2 = new Dog();
		Pet cat2 = new Cat();
		Pet dog3 = new Dog();
		Pet cat3 = new Cat();

		test.add(dog1);
		test.add(cat1);
		test.add(dog2);
		test.add(cat2);
		test.add(dog3);
		test.add(cat3);

		test.add(dog1);
		test.add(cat1);
		test.add(dog2);
		test.add(cat2);
		test.add(dog3);
		test.add(cat3);

		test.add(dog1);
		test.add(cat1);
		test.add(dog2);
		test.add(cat2);
		test.add(dog3);
		test.add(cat3);
		while (!test.isDogQueueEmpty()) {
			System.out.println(test.pollDog().getPetType());
		}
		while (!test.isEmpty()) {
			System.out.println(test.pollAll().getPetType());
		}
	}

}

 reference:左神   

encouragement:  

    趁着都还在,珍惜身边的人,不要等失去的时候才后悔,我花了几年的时间才真正搞清楚这句话的含义。

 

 

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页