【问题标题】:How to turn an ArrayList of a class into a HashMap?如何将一个类的ArrayList变成一个HashMap?
【发布时间】:2021-12-21 16:58:12
【问题描述】:

我想将我的 ArrayLists 更改为 HashMaps。下面是我的代码,它获取食物并返回其价格。我有一个餐厅的 ArrayList,menuList。 Restaurant 类包含一个菜单,目前也是一个 ArrayList。我想查找一个 foodItem 字符串,它可能在任何餐厅(并且存在并且是该餐厅独有的)。我认为最好的菜单是 HashMap,包含菜单类型的 HashMap 菜单看起来如何?我最好也存储餐厅的 HashMap,而不是 ArrayList?那么我的查找会有什么不同?

餐厅类:

public class Restaurant {

    String name;
    String location;
    ArrayList<Menu> menu;

    public int getCost(String foodItem) {

            for (Menu item : menu) {
                if (item.item.equals(foodItem)) {
                    return item.pence;
                }
            }
        return 0;
    }

}

菜单类:

public class Menu {
    String item;
    int cost;
}

其他地方返还费用的方法:

for (Restaurant i : menuList) {  
                for (Menu items : i.menu) { 
                        if (Objects.equals(items.item, foodItem))
                            cost += i.getCost(foodItem);
                    }
                }
            

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    将“Menu”类重构为“Item”类并生成getter和setter;

    public class Item {
    String name;
    int cost;   
    }
    

    因此,在您的“餐厅”类中,您无需声明 getCost() 并声明:

    ArrayList<Item> menu;
    

    更有意义的是,因为菜单是项目的列表,而您只需调用:

    for (Item item : menu) { 
        if (Objects.equals(item.getName(), foodItem))
                            cost += item.getCost();
                    }
    

    【讨论】:

      【解决方案2】:

      按照将Menu 重命名为更清晰的Item 的建议,它可能看起来像这样:

      public class Restaurant {
      
          String name;
          String location;
          Map<String, Item> menu = new HashMap<>();
      
          public Collection<Item> getMenu() {
              menu.values();
          }
      
          public int getCost(String foodItem) {
              Item item = menu.get(food item);
              return item == null ? 0 : item.getCost();
          }
      }
      

      您应该为您的List&lt;Restaurant&gt; 做同样的事情吗?这取决于。如果您只使用它来寻找餐厅,可以,但通常您更喜欢ListSet 而不是Map。现在,menu 的唯一目的是用于搜索项目,而您正在设计您的班级仅用于该目的。如果您需要相同的类来处理其他内容,您现在可以使用 Map 专门用于使用键进行搜索,但例如未针对循环遍历每个菜单项进行优化。

      【讨论】:

      • 在Item中重复item的名称是没有意义的。为什么不只是Map&lt;String, Integer&gt; costs
      猜你喜欢
      • 1970-01-01
      • 2019-09-13
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      相关资源
      最近更新 更多