java - 在 HashMap 中的对象内搜索标签

标签 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;}

但问题是,如果用户使用“汉堡”之类的标签搜索食物,希望显示巨无霸,则该方法需要已知 key 并在代码中;因此,违背了沿着值搜索的目的。

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

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

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

感谢您的帮助,非常感谢!

最佳答案

最后一个 fragment 可能是一个可行的解决方案。

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

这里,v是一种Food类型,所以显然它没有contains方法,因为你没有实现它。 正如我所见,您需要在 v.tags 字段中搜索,但它是一个字符串数组,没有 contains 方法。我建议将tags字段的类型从String[]更改为List,然后你可以使用tags.contains(needle)在tags中查找指定的搜索项。

编辑: 对于Map问题

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

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

问题是,这样,没有人知道这是一个 String,Food HashMap ,所以如果你想将它分配给一个 String,Food 条目,显然你会得到错误。

我建议这样使用它: private Map Foods = new HashMap<>();

同时更改 getter setter 以返回/接受 Map

注意:在编程中使用接口(interface)而不是具体类型是更好的方法,但是如果您仍然想指定这是一个 HashMap(我不明白为什么您会这样做,但让我们假设),那么将您的变量声明为HashMap 食物

这应该可以完成工作:)

关于java - 在 HashMap 中的对象内搜索标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57064466/

相关文章:

java - 您认为最好的策略是创建一个临时 XML 文件,通过 FTP 发送它,然后在 Web 应用程序中删除它?

android - 开发从右到左的 Android 应用程序

java - 如何比较java中的2条语句

Java 断言 - $assertionsDisabled 与 $assertionsEnabled

java - 对可变参数方法的调用不明确

android - 在方向更改时保留列表 fragment 中的列表

java - 通过 for 循环将子列表添加到 arraylist

java - ArrayList 对象运行时输入被视为字符串

java - select 子句中的 Hibernate Criteria SubSelect

java - Android (Eclipse) 中的 Spy/Watch 变量