如何根据重要成分搜索配方?java android

如何根据重要成分搜索配方?java android,java,android,arraylist,Java,Android,Arraylist,我想搜索与购物清单项目匹配的配方,它会根据香蕉奶昔中最重要的成分向用户建议配方{牛奶和香蕉}可以单独制作香蕉奶昔{糖和香草}是可选的,如果我在购物清单上添加类似{香蕉,牛奶}的项目它将根据这些成分而不是{香蕉、牛奶、糖和香草}来搜索食谱 例如: Banana Milk Shake Ingredients: **Ingredient Name 1.banana (important) 2.milk

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

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;
    }
}
public Set searchby配料(列表商店、列表列表){
int matchedItems=0;
Set result=new HashSet();
用于(配方rn:列表){
布尔倒数匹配=假;
用于(购物清单r:商店){
对于(int i=0;i=2){
结果:添加(rn);
recipeMatched=true;
}
}
如果(相互匹配)
打破
}
如果(相互匹配)
打破
}
matchedItems=0;
}
返回结果;
}
公共类Recipe实现可序列化{
私有字符串指令;
私有字符串名称;
私有字符串图像;
private List ing=new ArrayList();
公共配方(){
}
公共配方(串项、串权){
本品添加(新成分(项,全));
}
公共列表getIngre(){
回归分析;
}
公共字符串获取(int i){
返回ing.get(i.toString();
}
公共成分(列表项){
此项=项目;
}
公共字符串getRecName(){
返回recName;
}
public void setRecName(字符串recName){
this.recName=recName;
}
//@覆盖
公共字符串toString(){
返回recName;
}
公共字符串getInstructions(){
返回指令;
}
公共无效集合指令(字符串指令){
本说明=说明;
}
公共字符串getImage(){
返回图像;
}
公共void setImage(字符串图像){
这个图像=图像;
}
}

基于您的评论。您可以向配料类添加另一个变量。像这样:

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

}

然后你可以检查配方中是否有所有重要的成分。

问题是什么?@JeremyGordon我想搜索与购物清单项目匹配的配方,它会根据最重要的成分向用户推荐配方,如香蕉奶昔{牛奶和香蕉}可以单独制作香蕉{糖和香草}是可选的,如果我在购物清单上添加{香蕉,牛奶}之类的项目,它将根据这些成分搜索配方,而不是添加{香蕉,牛奶,糖和香草}你可能想做一些事情,比如给配方中的每个元素赋予一个重要程度,然后为每个潜在匹配计算分数。如果你想处理替换,事情会变得更复杂,无论是在配方本身中,还是通过一些规则。@ChrisStratton如何赋予这种重要性?你能修改我的密码吗code@ChrisStratton如何给予这种重要性?你能修改我的代码吗?我试过了,但我没有用布尔值,而是给成分指定了权重值,比如值1表示不重要,值2表示重要@EricB。当你有两个以上的值时,分配权重是个好主意。但如果只有2个值,比如1和2,布尔值就足够了。再说一遍,这完全取决于你。那么如何使用这些重量呢?比如,如果我有重量为5的香蕉和重量为4的牛奶,等等,我会分配这些重量。。那么所有的权重都加起来了@埃里克,这要看情况。根据您最初的帖子,您的问题是将一种成分识别为重要和不重要,这种情况可以用布尔值处理。在给予每种成分一定程度的重要性(即重量)之前,问问自己,这样做会给你带来什么好处?您试图通过分配无法通过布尔值实现的权重来实现什么?