package c;
import java.util.LinkedList;
import java.util.Objects;
import java.util.Queue;
public class CatDogQueue {
Queue<Element> catQueue = new LinkedList<>();
Queue<Element> dogQueue = new LinkedList<>();
Long seq = 0L;
public static final String CAT_TYPE = "cat";
public static final String DOG_TYPE = "dog";
public void add(Pet pet) {
Element element = new Element(pet, seq);
seq++;
if (Objects.equals(pet.getType(), CAT_TYPE)) {
catQueue.add(element);
} else if (Objects.equals(pet.getType(), DOG_TYPE)) {
dogQueue.add(element);
} else {
throw new RuntimeException("unknown pet type");
}
}
public Pet pollAll() {
if (!dogQueue.isEmpty() && !catQueue.isEmpty()) {
Element cat = catQueue.peek();
Element dog = dogQueue.peek();
if (cat.getSeq() < dog.getSeq()) {
return catQueue.poll().getPet();
} else {
return dogQueue.poll().getPet();
}
} else if (!dogQueue.isEmpty()) {
return dogQueue.poll().getPet();
} else if (!catQueue.isEmpty()) {
return catQueue.poll().getPet();
}
return null;
}
public Pet pollDog() {
if (!dogQueue.isEmpty()) {
return dogQueue.poll().getPet();
}
return null;
}
public Pet pollCat() {
if (!catQueue.isEmpty()) {
return catQueue.poll().getPet();
}
return null;
}
}
class Pet {
String type;
public Pet(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
class Cat extends Pet {
public Cat() {
super("cat");
}
}
class Dog extends Pet {
public Dog() {
super("dog");
}
}
class Element {
Pet pet;
Long seq;
public Element(Pet pet, Long seq) {
this.pet = pet;
this.seq = seq;
}
public Pet getPet() {
return pet;
}
public Long getSeq() {
return seq;
}
}