【题目】:已知宠物、猫和狗的类如下:
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");
}
}
实现一种猫狗队列的结果,要求如下:
- 用户可以调用add()方法将cat类或dog类的实例放入队列中。
- 用户可以调用pollAll()方法,将队列中所有的实例按照进队列的先后顺序依次弹出。
- 用户可以调用pollDog()方法,将队列中dog类的实例按照进队列的先后顺序依次弹出。
- 用户可以调用pollCat()方法,将队列中cat类的实例按照进队列的先后顺序依次弹出。
- 用户可以调用isEmpty()方法,检查队列是否还有dog或cat的实例。
- 用户可以调用isDogEmpty()方法,检查队列中是否有dog类的实例。
- 用户可以调用isCatEmpty()方法,检查队列中是否有cat类的实例。
【思考】:本题是实现在不同的实例上盖时间戳的方法,但是又不能改变用户本身的类,我们通过创建一个新的类来解决这个问题。
【方案】:我们创建一个新的类PetCountQueue。
public class PetCountQueue {
private Pet pet;
private long count;
public Pet getPet() {
return pet;
}
public void setPet(Pet pet) {
this.pet = pet;
}
public long getCount() {
return count;
}
public void setCount(long count) {
this.count = count;
}
}
根据题目要求,猫狗队列如下:
import java.util.LinkedList;
import java.util.Queue;
public class DogCatQueue {
private Queue<PetCountQueue> dogQ;
private Queue<PetCountQueue> catQ;
private long count;
public DogCatQueue(){
dogQ = new LinkedList<PetCountQueue>();
catQ = new LinkedList<PetCountQueue>();
count = 0;
}
/**用户可以调用add()方法将cat类或dog类的实例放入队列中。*/
public void add(Pet pet) {
if(pet.getPetType().equals("dog")) {
dogQ.add(new PetCountQueue(pet,count++));
}else if(pet.getPetType().equals("cat")) {
catQ.add(new PetCountQueue(pet,count++));
}else {
System.out.println("error,not dog or cat");
}
}
/**用户可以调用pollAll()方法,将队列中所有的实例按照进队列的先后顺序依次弹出。*/
public Pet pollAll() {
//如果猫和狗队列均不为空,通过时间戳【count】来决定弹出的数据。
if(!catQ.isEmpty() && !dogQ.isEmpty()) {
if(dogQ.peek().getCount() < catQ.peek().getCount()) {
return dogQ.poll().getPet();
}else {
return catQ.poll().getPet();
}
//如果猫队列不为空,直接弹出猫队列
}else if(!catQ.isEmpty()) {
return catQ.poll().getPet();
}else if(!dogQ.isEmpty()) {
return dogQ.poll().getPet();
}else {
throw new RuntimeException("erroe,Queue is Empty");
}
}
/**用户可以调用pollDog()方法,将队列中dog类的实例按照进队列的先后顺序依次弹出。*/
public Dog pollDog() {
if(!isDogQueueEmpty()) {
return (Dog) dogQ.poll().getPet();
}else {
throw new RuntimeException("The DogQueue is Empty");
}
}
/**用户可以调用pollCat()方法,将队列中cat类的实例按照进队列的先后顺序依次弹出。*/
public Cat pollCat() {
if(!isCatQueueEmpty()) {
return (Cat) catQ.poll().getPet();
}else {
throw new RuntimeException("The CatQueue is Empty");
}
}
/**用户可以调用isEmpty()方法,检查队列是否还有dog或cat的实例。*/
public boolean isEmpty() {
return dogQ.isEmpty() && catQ.isEmpty();
}
/**用户可以调用isDogEmpty()方法,检查队列中是否有dog类的实例。*/
public boolean isDogQueueEmpty() {
return dogQ.isEmpty();
}
/**用户可以调用isCatEmpty()方法,检查队列中是否有cat类的实例。*/
public boolean isCatQueueEmpty() {
return catQ.isEmpty();
}
}