【问题标题】:Iterating through a HashMap until the first value is found?遍历 HashMap 直到找到第一个值?
【发布时间】:2019-05-01 13:19:10
【问题描述】:

我有一个 HashMap,我用它来存储一个整数 id 和一个字符串值。

我希望能够根据用户输入的字符串从 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 个不同的 HashMap 执行相同的方法.

【问题讨论】:

  • 这个映射包含什么(作为键和值。不仅仅是类型:它们的含义)。你想达到什么目的?整个设计看起来确实有问题,但由于我们不知道您要设计什么,因此很难提供帮助。
  • 我正在做一个停车结构,我使用 ArrayList 来存储车辆,并使用每个 Zone 的 HashMap 将其划分为 Zones。 Key是车位ID,车牌代表车位在哪个车位。然后当用户进入盘子时,它会移除它,然后将“空”放在它的位置。我还有另一种方法将车辆放在“空”的地方。我敢肯定有更好,更合乎逻辑的方法,这正是我首先想到的:l
  • 如果你的目标是从一个车牌中找到空间ID,那么地图的键应该是车牌,值是空间ID,反之亦然。如果您真的想要或需要保持这种方式,则在条目上 循环 以找到将盘子作为值的条目。您的代码重复同一件事 5 次,并且仅在您的停车场只有 5 个车位时才有效。
  • 是的,我想这样循环它,我只是不知道该怎么做,还有我会从改变它得到什么,让那个盘子成为关键?遍历它并细化密钥会比找到值更容易吗?
  • 如果有map的key就不需要迭代了。您需要做的就是在地图上调用 get(key) 来获取值。这就是地图的原理。您已经知道如何在地图的 entrySet 上获取迭代器。所以使用循环来迭代它而不是调用 next() 5 次。

标签: java loops if-statement hashmap compare


【解决方案1】:

也许这样的事情会对你有所帮助

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

【讨论】:

    【解决方案2】:

    如果您按照 JB Nizet 在 cmets 中的建议反转地图,可能会更容易。直观地说,如果您正在寻找车牌及其所在位置,则您的地图将停车位 ID 存储为车牌号的函数会更有意义。然后它使您的任务变得微不足道:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 2023-03-17
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多