【发布时间】:2019-07-16 19:47:50
【问题描述】:
我正在尝试设置一个搜索功能,用户可以在其中根据用户输入搜索食品。 HashMap 中的项目设置为具有 Food 类对象的 UUID 和对象本身。
这是食物的仓库
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class FoodRepository {
// Create a hash map
private HashMap foods = new HashMap();
// Constructor
public FoodRepository () {
//Food Objects
NutritionFacts cokeNutritionFacts = new NutritionFacts(190, 0, 60, 54, 54, 0);
String[] cokeTags = {"Drink", "Cola", "Coca-Cola"};
Food coke = new Food("Coca-Cola", cokeNutritionFacts, cokeTags);
foods.put(coke.getUUID(), coke);
NutritionFacts drpepperNutritionFacts = new NutritionFacts(180, 0, 75, 48, 47, 0);
String[] drpepperTags = {"Drink", "Cola", "Dr Pepper"};
Food drpepper = new Food( "Dr Pepper", drpepperNutritionFacts, drpepperTags);
foods.put(drpepper.getUUID(), drpepper);
NutritionFacts cfaSandwichNutritionFacts = new NutritionFacts(440, 19, 1350, 40, 5, 28);
String[] cfaSandwichTags = {"Entree", "Sandwich", "Dinner", "Lunch", "Chick Fil A"};
Food cfaSandwich = new Food( "Chick Fil A Chicken Sandwich", cfaSandwichNutritionFacts, cfaSandwichTags);
foods.put(cfaSandwich.getUUID(), cfaSandwich);
NutritionFacts bigMacNutritionFacts = new NutritionFacts(540, 28, 940, 42, 9, 25);
String[] bigMacTags = {"Entree", "Burger", "Dinner", "Lunch", "McDonalds"};
Food bigMac = new Food( "McDonalds Big Mac", bigMacNutritionFacts, bigMacTags);
foods.put(bigMac.getUUID(), cfaSandwich);
// Get a set of the entries
Set foodSet = foods.entrySet();
}
// Getter methods
public HashMap getFoods() {
return foods;
}
// Setter methods
public void setFoods(HashMap foods) {
this.foods = foods;
}
}
这是 Food 类,它定义了进入 HashMap 的对象(省略了 getter 和 setter)
public class Food {
// Class variables
private String uuid;
private String name;
private NutritionFacts nutritionFacts;
private String[] tags;
// Constructor
public Food(String name, NutritionFacts nutritionFacts, String[] tags) {
this.uuid = UUID.randomUUID().toString();
this.name = name;
this.nutritionFacts = nutritionFacts;
this.tags = tags;
}
}
最后,这是营养成分课
public class NutritionFacts {
// Class Variables
private int calories;
private int fat;
private int sodium;
private int carbs;
private int sugar;
private int protein;
//private int iron;
//private int calcium;
//private int vitaminA;
//private int VitaminC;
//Constructor
public NutritionFacts(int calories, int fat, int sodium, int carbs, int sugar, int protein){
this.calories = calories;
this.fat = fat;
this.sodium = sodium;
this.carbs = carbs;
this.sugar = sugar;
this.protein = protein;
}
}
注意,如果这太多了,我很抱歉;这是我的搭档,也是我第一次使用android studio,我们都对java不太熟悉。
我们一直在考虑可以按照以下思路进行操作:
int caloriesConsumed = 0;
String searchValue = scan.nextString();
boolean flag = Arrays.asList(foods.get(key).tags).contains(searchValue); if(flag == true) {
caloriesConsumed = (caloriesConsumed + xxx;}
但问题是,如果用户使用“burger”之类的标签搜索食物,希望显示巨无霸,则该方法需要知道密钥并在代码中;因此,违背了沿值搜索的目的。
我们也看到有些人使用这样的方法:
String needle = "burger"
for(Map.Entry<String, Food> entry : foods.entrySet()) {
Food v = entry.getValue();
if(v.contains(needle))
caloriesConsumed = (caloriesConsumed + xxx);
}
但 .contains() 方法不适用于字符串/不兼容,因为 HashMap 的值是特殊对象而不是常规数据类型。
感谢所有帮助,非常感谢!
【问题讨论】:
-
不是直接回答您的问题,但从您的问题描述看来,您最好使用将关键字与食物列表相关联的哈希映射,而不是将 UUID 与食物相关联。这样,当有人询问所有带有关键字“burger”的食物时,您可以使用 HashMap 的
get()方法查找该键并返回结果,而不必扫描地图中的所有内容。
标签: java android arraylist hashmap