我想访问 PetQueue 并使用宠物的 ID 号将 Pet 对象(不仅仅是 ID 号)添加到可用的最短队列中。我不确定是否要管理队列,找到最短的队列。每当我运行它时,它总是将宠物添加到同一个队列中,无论大小如何。
static void admitPatient(Map<Integer, Pet> readPets, HashMap<String, PetQueue> vetMap) {
if (vetMap.isEmpty()) {
System.out.println("No vets are currently checked in.");
} else {
System.out.print("Enter the pet's id number: ");
int petID = Integer.parseInt(keyb.nextLine());
Pet p1 = readPets.get(petID);
if (p1 != null) {
PetQueue shortestQueue = null;
Map.Entry<String, PetQueue> entry = vetMap.entrySet().iterator().next();
//System.out.println(entry);
int size = entry.getValue().size() +1;
String drName = "";
System.out.println("size" + size);
for (Map.Entry<String, PetQueue> vetsAndQueue : vetMap.entrySet()) {
// System.out.println(vetsAndQueue.getValue());
// PetQueue vetsAndQSize = vetsAndQueue.getValue();
if (vetsAndQueue.getValue().size() <= size){
shortestQueue = vetsAndQueue.getValue();
shortestQueue.enqueue(p1);
drName = vetsAndQueue.getKey();
}
}
vetMap.put(drName,shortestQueue);
System.out.printf("%s will see Dr. %s\n", p1, drName);
}else{
System.out.printf("No pet found with ID %d\n", petID);
}
}
}
}
最佳答案
用于查找短路队列的逻辑不清楚。
首先,将搜索限制设置为 int size = entry.getValue().size() +1;
这是迭代器中第一个元素的大小加一。
然后你使用 if (vetsAndQueue.getValue().size() <= size)
找到最短的队列。大多数时候,它只会遇到迭代器中相同的第一个元素,并且只会遇到 if block ,并且 pet 将直接入队。这就是为什么你最终会让宠物总是在同一个队列中。
size
的定义变量没有意义,因为您无法保证 vetMap 中的第一个队列的大小最小。
正如其他人的回答一样,您只需要等待,直到找到真正最短的队列来满足您的宠物元素。它可能看起来像这样:
static void admitPatient(Map<Integer, Pet> readPets, HashMap<String, PetQueue> vetMap) {
if (vetMap.isEmpty()) {
System.out.println("No vets are currently checked in.");
} else {
System.out.print("Enter the pet's id number: ");
int petID = Integer.parseInt(keyb.nextLine());
Pet p1 = readPets.get(petID);
if (p1 != null) {
Map.Entry<String, PetQueue> shortestQueueVet = null;
Map.Entry<String, PetQueue> entry = vetMap.entrySet().iterator().next();
//System.out.println(entry);
int size = entry.getValue().size();
String drName = "";
System.out.println("size" + size);
for (Map.Entry<String, PetQueue> vetsAndQueue : vetMap.entrySet()) {
if (vetsAndQueue.getValue().size() < size){// here keep finding shortest queue
size = vetsAndQueue.getValue().size();
shortestQueueVet = vetsAndQueue;
}
}
shortestQueueVet.getValue().enqueue(p1);
drName = shortestQueueVet.getKey();
//vetMap.put(drName, shortestQueue); ##you don't need to re-put the element since the key remains unchanged
System.out.printf("%s will see Dr. %s\n", p1, drName);
}else{
System.out.printf("No pet found with ID %d\n", petID);
}
}
}
}
关于java - 我将如何管理 HashMap 中的队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61605913/