【问题标题】:how to search recipe based on important ingredients ? java android如何根据重要成分搜索食谱? java 安卓
【发布时间】:2016-10-01 05:34:55
【问题描述】:

我想搜索与购物清单项目匹配的食谱,它会根据最重要的成分向用户建议食谱,例如香蕉奶昔 {牛奶和香蕉} 可以单独制作香蕉奶昔 {糖和香草} 是可选的,如果我在购物清单上添加项目,例如 {banana,milk} 它会根据这些成分而不是 {banana,milk,sugar 和 vanilla} 搜索食谱 例如:

Banana Milk Shake Ingredients:

**Ingredient Name                
  1.banana                         (important)
  2.milk                           (important)
  3.vanilla                        (optional/not important)
  4.sugar                          (optional/not important) 

**Shopping List**
  • 香蕉
  • 牛奶
  • 鸡蛋
  • 大米

我们还可以制作不加糖和香草的香蕉奶昔,因此重要的成分将是牛奶和香蕉。

public class Ingredient implements Serializable{

    private String name;
    private String quantity;

    public  Ingredient(){

    }

    public Ingredient(String name,String quantity){
        this.name=name;
        this.quantity=quantity;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

    public String getQuantity() {
        return quantity;
    }

    public void setQuantity(String quantity) {
        this.quantity = quantity;
    }

}

和我的工作代码:

public Set<Recipe> searchByIngredient(List<ShoppingList> shop, List<Recipe> list) {
     int matchedItems = 0;
     Set<Recipe> result = new HashSet<Recipe>();
     for (Recipe rn : list) {
          boolean recipeMatched = false;

          for (ShoppingList r : shop) {

               for (int i = 0; i < rn.getIngre().size(); i++) {
                    if (rn.getIng(i).contains(r.getName())) {
                        matchedItems++;

                        int temp = matchedItems;

                        if(temp >= 2){
                            result.add(rn);
                            recipeMatched = true;
                        }

                    }
                    if (recipeMatched)
                        break;
               }

               if (recipeMatched)
                    break;
          }
          matchedItems = 0;
     }
     return result;
}

public class Recipe implements Serializable{

    private  String instructions;
    private String recName;
    private String image;
    private List<Ingredient> ing = new ArrayList<Ingredient>();

    public Recipe(){

    }
    public Recipe(String item,String quan){
        this.ing.add(new Ingredient(item, quan));
    }


    public List<Ingredient> getIngre(){
        return ing;
    }
    public String getIng(int i){

        return ing.get(i).toString();
    }
    public void setIngredients(List<Ingredient> item){
        this.ing = item;
    }

    public String getRecName() {
        return recName;
    }

    public void setRecName(String recName) {
        this.recName = recName;
    }

    // @Override
    public String toString() {
        return recName;
    }

    public String getInstructions() {
        return instructions;
    }

    public void setInstructions(String instructions) {
        this.instructions = instructions;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }
}

【问题讨论】:

  • 有什么问题?
  • @JeremyGordon 我想搜索与购物清单项目匹配的食谱,它会根据最重要的成分向用户推荐食谱,例如香蕉奶昔 {牛奶和香蕉} 可以单独制作香蕉 {糖和香草} 是可选的,如果我在购物清单上添加 {banana,milk} 等项目,它将根据这些成分搜索食谱,而不是我将添加 {banana,milk,sugar 和 vanilla}
  • 你可能想做一些事情,比如给配方中的每个元素一个重要程度,然后计算每个潜在匹配的分数。如果您想尝试处理替换,则事情会变得更加复杂,无论是在配方本身中显式处理,还是通过某些规则集。
  • @ChrisStratton 如何赋予这种重要性?你能修改我的代码吗
  • @ChrisStratton 如何赋予这种重要性?你能修改我的代码吗

标签: java android arraylist


【解决方案1】:

根据您的 cmets。您可以将另一个变量添加到您的成分类。像这样:

public class Ingredient implements Serializable{

    private String name;
    private String quantity;
    private boolean isImportant;

    public  Ingredient(){

    }

    public Ingredient(String name,String quantity){
        this.name=name;
        this.quantity=quantity;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

    public String getQuantity() {
        return quantity;
    }

    public void setQuantity(String quantity) {
        this.quantity = quantity;
    }

    public boolean getIsImportant() {
        return isImportant;
    }

    public void setIsImportant(boolean isImportant) {
        this.isImportant= isImportant;
    }

}

然后您可以检查配方是否存在所有重要成分。

【讨论】:

  • 我试过了,但我没有为布尔值分配权重值,例如不重要的值 1 和重要的@EricB 值 2。
  • 当您有超过 2 个值时,分配权重是个好主意。但是,如果您只有 2 个值,例如 1 和 2,则布尔值就足够了。话又说回来,这完全取决于你。
  • 那么如何使用这些权重呢?就像我有(成分)香蕉重量为 5 和牛奶重量为 4 等等 [5 到 1] 我将分配这些重量.. 所以所有的重量都加起来? @EricB。
  • 视情况而定。根据您的原始帖子,您的问题是将成分识别为重要和不重要,这种情况可以用布尔值处理。在给每种成分赋予一定程度的重要性之前,问问自己,这样做会带来什么好处?你想通过分配无法通过布尔值实现的权重来实现什么?
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多