在哈希图中搜索对象内的标签

时间:2019-07-16 19:47:50

标签: java android arraylist hashmap

我正在尝试建立一个搜索功能,用户可以根据用户输入来搜索食品。 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;}

但是问题是,如果用户正在使用“汉堡”之类的标签搜索食物,希望显示一个大型Mac,则该方法需要知道密钥并在代码中;因此,破坏了沿价值搜索的目的。

或者我们看到有些人使用这样的方法:

String needle = "burger"
for(Map.Entry<String, Food> entry : foods.entrySet()) {
     Food v = entry.getValue();
     if(v.contains(needle))
          caloriesConsumed = (caloriesConsumed + xxx);
     }

但是.contains()方法不适用于字符串/不兼容,因为HashMap的值是一个特殊对象,而不是常规数据类型。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

最后一个代码段可能是可行的解决方案。

if(v.contains(needle)){
    caloriesConsumed = (caloriesConsumed + xxx);
}

在这里,v是食品的一种,因此很显然,由于您未实现,它没有包含方法。 如我所见,您需要在v.tags字段中进行搜索,但这是一个字符串数组,其中没有contains方法。我建议将标签字段的类型从String []更改为List ,然后可以使用tags.contains(needle)在标签中查找指定的搜索项。

编辑: 对于Map 问题

在您的代码中,我看到您使用的是原始HashMap类型

// Create a hash map
private HashMap foods = new HashMap();

问题是,以这种方式,没人知道这是一个String,Food哈希图,所以很显然,如果要将其分配给String,Food条目,则会出错。

我建议这样使用它:     私有Map foods = new HashMap <>();

也将getter setter更改为return / accept Map

注意:在编程中,使用接口而不是具体类型是一种更好的方法,但是如果您仍要指定这是HashMap(我看不到为什么,但是假设),则将变量声明为HashMap 食物

那应该做的事:)