【问题标题】:Searching for tags within an object in a hashmap在哈希图中搜索对象内的标签
【发布时间】: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


【解决方案1】:

最后一个 sn-p 可能是一个可行的解决方案。

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

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

编辑: 对于 Map 问题

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

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

问题是,这样一来,没有人知道这是一个 String,Food 哈希图,所以如果你想将它分配给一个 String,Food 条目,显然会出错。

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

还将 getter setter 更改为 return/accept Map

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

这应该可以完成工作:)

【讨论】:

  • 是的,将 Array 更改为 List 似乎可以让 .contains 方法检查它,谢谢!
  • // test int caloriesConsumed = 0; String searchValue = "burger"; for(Map.Entry&lt;String, Food&gt; entry : foods.entrySet()) { Food v = entry.getValue(); if(v.getTags().contains(searchValue)) caloriesConsumed = (caloriesConsumed + v.getNutritionFacts().getCalories()); } 我现在遇到的问题是 Map.Entry 部分,android studio 似乎认为这是错误的类型,但我不明白它为什么不能是 String和类型的食物,因为那是地图上的内容。
  • 编辑了答案
猜你喜欢
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2017-11-28
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2010-09-08
相关资源
最近更新 更多