Итерация по HashMap до тех пор, пока не будет найдено первое значение? - PullRequest
0 голосов
/ 01 мая 2019

У меня есть HashMap, который я использовал для хранения целочисленного идентификатора и строкового значения.

Я хотел иметь возможность удалять вещи из HashMap на основе строки ввода пользователя. То, как я это делаю, таково:

        public void pickingVehicleUp() {

        System.out.println("Please enter number plate: ");
        input = new Scanner(System.in);
        String PLATE = input.nextLine();
        Iterator<Map.Entry<Integer, String>> iter = zone_1.entrySet().iterator();

        Map.Entry<Integer, String> Empty1 = iter.next();
        Map.Entry<Integer, String> Empty2 = iter.next();
        Map.Entry<Integer, String> Empty3 = iter.next();
        Map.Entry<Integer, String> Empty4 = iter.next();
        Map.Entry<Integer, String> Empty5 = iter.next();

        zone_1.entrySet().removeIf(entry -> (PLATE.equals(entry.getValue())));

        if (Empty1.getValue().equals(PLATE)) {
            Integer key = Empty1.getKey();
            zone_1.put(key, "Empty");
        } else if (Empty2.getValue().equals(PLATE)) {
            Integer key = Empty2.getKey();
            zone_1.put(key, "Empty");
        } else if (Empty3.getValue().equals(PLATE)) {
            Integer key = Empty3.getKey();
            zone_1.put(key, "Empty");
        } else if (Empty4.getValue().equals(PLATE)) {
            Integer key = Empty4.getKey();
            zone_1.put(key, "Empty");
        } else if (Empty5.getValue().equals(PLATE)) {
            Integer key = Empty5.getKey();
            zone_1.put(key, "Empty");
        } else {
            System.out.println("That number plate doesn't exist!");
        }
    }

Хотя этот код работает нормально, я думаю, что он очень неопрятный, и, возможно, есть гораздо более эффективные способы сделать это, и я хотел бы найти один из этих способов, так как мне нужно сделать этот же метод для 5 различных HashMaps .

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Вероятно, было бы проще, если бы вы перевернули Карту, как предлагает Дж. Б. Низет в комментариях. Интуитивно понятно, что если вы ищете Plate и там, где он находится, для вашей карты имеет больше смысла хранить идентификатор парковочного места как функцию номера Plate. Тогда это делает вашу задачу тривиальной:

String PLATE = "PLATE1";
Map<String, Integer> plateToParkingSpaceID = new HashMap<>();

plateToParkingSpaceID.put("PLATE1", 1);
plateToParkingSpaceID.put("PLATE2", 2);
plateToParkingSpaceID.put("PLATE3", 3);
plateToParkingSpaceID.put("PLATE4", 4);

if (plateToParkingSpaceID.containsKey(PLATE)) {
    plateToParkingSpaceID.remove(PLATE);
} else {
    System.out.println("That number plate doesn't exist!");
}

Однако, если вы сохраняете текущую схему отображения парковочного места на лицензионное место, мы можем сделать следующее:

String PLATE = "PLATE1";
Optional<Integer> parkingSpaceId = zone1.entrySet().stream()  // stream all of the entries in the zone1 Map
    .filter(e -> e.getValue().equals())                       // filter out all that don't have the correct plate
    .findFirst()                                              // there should be 0 or 1 of these, so we can stop as soon as we find the first one

if (parkingSpaceId.isPresent()) {
    zone1.remove(parkingSpaceId.get());  // remove that space from the map
} else {
    System.out.println("That number plate doesn't exist!");
}
0 голосов
/ 01 мая 2019

Может быть что-то подобное поможет вам

String PLATE = "PLATE";

    HashMap<Integer, String> map = new HashMap<>();
    map.put(1, "DOOR");
    map.put(2, "DOG");
    map.put(3, "PLATE");
    map.put(4, "SNOW");

    System.out.println("Before check - " + map);

    if (map.containsValue(PLATE)) {
        for (Map.Entry<Integer, String> item:map.entrySet()) {
            if (item.getValue().equals(PLATE)) {
                map.remove(item.getKey());
                break;
            }
        }
    }

    System.out.println("After check - " + map);
...