我想将ArrayLists更改为HashMaps。下面是我的代码,它获取一个食物并返回其价格。我有一个餐馆的排列列表,菜单列表。Restaurant类包含一个菜单,目前也是一个ArrayList。我想查找foodItem字符串,该字符串可以在任何餐厅中(并且存在并且是该餐厅唯一的(。我认为菜单最好是一个HashMap,包含menu类型的HashMap菜单会是什么样子?我最好也存储Restaurant's的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);
}
}
重构"菜单";类到";项目";类并生成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();
}
根据将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<Restaurant>
做同样的事情吗?这取决于情况。如果你只是用它来找餐厅,是的,但通常你更喜欢List
或Set
而不是Map
。现在菜单的唯一目的是用来搜索一个项目,而你正在设计你的类只是为了这个目的。如果您曾经需要相同的类来处理其他内容,那么您现在有了一个Map
,它专门用于使用键进行搜索,但例如,它并没有针对遍历每个菜单项进行优化。