Как мне go об управлении очередями в хэш-карте? - PullRequest
0 голосов
/ 05 мая 2020

Я хочу получить доступ к PetQueue и, используя ID-номер питомца, добавляет объект Pet (а не только ID-номер) в самую короткую доступную очередь. Я не уверен в go насчет управления очередями и поиска самых коротких. Всякий раз, когда я запускаю это, он всегда добавляет питомца в одну и ту же очередь независимо от размера.

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

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Лог c, который вы используете для поиска закороченной очереди, неясен.

Сначала вы устанавливаете предел поиска равным int size = entry.getValue().size() +1;, что является размером первого элемента в итераторе плюс один .

Затем вы используете if (vetsAndQueue.getValue().size() <= size), чтобы найти самую короткую очередь. В большинстве случаев он просто сталкивается с одним и тем же первым элементом в итераторе и просто сталкивается с блоком if, и питомец будет напрямую поставлен в очередь. Вот почему питомец всегда находится в одной и той же очереди.

Определение переменной 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);
                }
            }
        }
}
0 голосов
/ 05 мая 2020

условие if

vetsAndQueue.getValue().size() <= size

здесь

size = vetMap.entrySet().iterator().next().size()+1;

, следовательно, всегда true, поэтому оно всегда будет добавляться в эту очередь, вместо этого вы можете использовать некоторую константу для ограничения размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...