题目
宠物、狗和猫的类如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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, 同上
- isEmpty, 检查队列中是否还有元素
- isDogEmpty, 检查队列中是否有dog类实例
- isCatEmpty, 检查队列中是否有cat类实例
思路
用三个队列, 一个cat队列只存放cat实例, 一个dog队列只存放dog实例, 再用总队列存放所有实例.
但是这样移除元素的时候, 总队列怎么更新? 比如队列顺序是 {cat1, dog1, dog2}, 调用pollDog(), 无法维护
加一层封装尝试解决问题, 用一个容器类PetQueueItem来封装Pet及其子类, 同时增加count属性来表示全局入队顺序
果然没有什么问题是加一层封装解决不了的QAQ
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| public class DogCatQueue { 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 PetQueueItem { private Pet pet; private Long count;
public PetQueueItem(Pet pet, Long count) { this.pet = pet; this.count = count; }
public Pet getPet() { return this.pet; }
public Long getCount() { return this.count; }
public String getPetType() { return this.pet.getPetType(); } }
private Queue<PetQueueItem> dogQueue; private Queue<PetQueueItem> catQueue; private Long count;
public DogCatQueue() { this.dogQueue = new LinkedList<PetQueueItem>(); this.catQueue = new LinkedList<PetQueueItem>(); this.count = 0L; }
public void add(Pet pet) { if (pet.getPetType().equals("dog")) { this.dogQueue.add(new PetQueueItem(pet, count++)); } else if (pet.getPetType().equals("cat")) { this.catQueue.add(new PetQueueItem(pet, count++)); } else { throw new RuntimeException("Pet must be dog or cat!"); } }
public Pet pollAll() { if (isDogEmpty() && isCatEmpty()) { throw new RuntimeException("Your queue is empty!"); } if (!isDogEmpty() && !isCatEmpty()) { if (dogQueue.peek().getCount() < catQueue.peek().getCount()) { return dogQueue.poll().getPet(); } else { return catQueue.poll().getPet(); } } if (!isDogEmpty()) { return dogQueue.poll().getPet(); } return catQueue.poll().getPet(); }
public Dog pollDog() { if (isDogEmpty()) { throw new RuntimeException("Your dog queue is empty!"); } return (Dog) dogQueue.poll().getPet(); }
public Cat pollCat() { if (isCatEmpty()) { throw new RuntimeException("Your cat queue is empty!"); } return (Cat) dogQueue.poll().getPet(); }
public Boolean isEmpty() { return isDogEmpty() && isCatEmpty(); }
public Boolean isDogEmpty() { return dogQueue.isEmpty(); }
public Boolean isCatEmpty() { return catQueue.isEmpty(); }
}
|