比较java中两个列表的元素

比较java中两个列表的元素,java,Java,我有两个列表,其中存储了一些信息。第一个列表的元素从数据库中提取(它们是配方的成分),在第二个列表中存储一些喜爱的成分。我想比较两个列表,当成分匹配时,我想在一个总和上加1。 我的问题是,当我解析第一个列表时,成分会与第二个列表进行比较,但在我的第一个列表中,元素不是由一个字符串组成的(一个元素有2-3个单词),当我比较列表时,只比较最后的元素,而不比较元素的组成部分 第一份名单: [200 grame fusilli cu legume (spanac si mere); 200 grame

我有两个列表,其中存储了一些信息。第一个列表的元素从数据库中提取(它们是配方的成分),在第二个列表中存储一些喜爱的成分。我想比较两个列表,当成分匹配时,我想在一个总和上加1。 我的问题是,当我解析第一个列表时,成分会与第二个列表进行比较,但在我的第一个列表中,元素不是由一个字符串组成的(一个元素有2-3个单词),当我比较列表时,只比较最后的元素,而不比较元素的组成部分

第一份名单:

[200 grame fusilli cu legume (spanac si mere);
200 grame smantana 12%; 
50 grame iaurt; 
50 grame cascaval afumat; 
1/2 lingurite mustar; 
doi catei de usturoi sau o lingurita de usturoi deshidratat; 
o lingur? ulei de masline; 
mere]
第二份名单:

[afine, almette, alune, alune, albus de ou de gaina, alune, andive, mere]
我的结果是

[0, 0, 0, 0, 0, 0, 0, 0, 0]
我们可以看到单词“仅仅”在第一个列表中遇到两次,在第二个列表中遇到一次,但结果是0。我怎样才能解决这个问题

以下是我的java代码:

rs=ps.executeQuery();                           
while( rs.next()){
String nrRet = rs.getString("Ingrediente");          
firstList.add(nrRet);                  
}
System.out.println(firstList);
Statement st1 = con.createStatement();
rs1 = st1.executeQuery("Select Nume from ingredientplacut where Id_user = '24'");


 while( rs1.next()){
   String nrRet1 = rs1.getString("Nume");
   secondList.add(nrRet1);                                
   }

   System.out.println(secondList);      
   ArrayList<String> al3= new ArrayList<String>();
   for (String temp : firstList)
   al3.add(secondList.contains(temp) ? "Yes" : "No");
   System.out.println(al3);


   ArrayList<Integer> al4= new ArrayList<Integer>();
   for (String temp2 : firstList)
   al4.add(secondList.contains(temp2) ? 1 : 0);
   System.out.println(al4);
我的结果是
[0,0,0,0,0,0,0,0]
而不是
[0,0,0,0,0,0,1]


有人能帮我吗?谢谢

您可以简单地添加一个内部for循环来检查内容。您的问题是列表2中的一个元素可以包含在列表1的一个元素中,而不是完全相同。例如,列表1有“200 grame fusilli cu豆类(spanac si-mile)”,而列表2只有“mile”。这可以通过添加另一个内部for循环来解决

请参阅下面的小代码,我已修复了“al3”的内容。您可以对al4执行相同的操作

 for (String temp : firstList)
       {
           boolean isTrue=false;
           for(String temp2:secondList)
           {
               if(temp.contains(temp2))
               {
                   isTrue=true;
                   break;
               }
           }
           if(isTrue)
               al3.add("YES");
           else
               al3.add("NO");

       }
对于您的输入集,al4的代码为:

for (String temp2 : secondList) {
        boolean isTrue = false;
        for (String temp : firstList) {
            if (temp.contains(temp2)) {
                isTrue = true;
                break;
            }
        }
        if (isTrue)
            al4.add(1);
        else
            al4.add(0);
    }
由于list2元素可以在list1元素中,因此我已经相应地自定义了代码。您可以根据输入模式自定义代码。

您看过如何使用它了吗


这将对两个集合执行匹配(您可能希望查看如何从第一个集合分割字符串),并为您提供这两个集合中存在的所有元素

为什么第一个列表用分号分隔,而第二个列表用逗号分隔?我这么问是因为我不确定你的实际投入是什么。打印列表通常使用逗号格式化。我怀疑这里发生了什么奇怪的事情。尤其是因为您的输入列表有8个元素,而结果有9个元素。信息是从数据库中提取的,在每行插入分号后,表中的第二个列表不是分号,因为表中只显示一个数据,与第一个数组不同,请尝试以下操作:
for(字符串成分:firstList)System.out.printf(“\%s\”:%s%n”,成分,第二个列表。包含(成分))产量是多少?“200克fusilli cu豆科植物;200克smantana 12%;50克iaurt;50克Cascava afumat;1/2 lingurite mustar;doi cati de usturoi sau o lingurita de usturoi deshidrata;afine;Mire;patrunjel;piper;sare.”:false[0,0,0,0,0,0,0,0,0]不是[1,0,0,0,0,0,0,0,0,0,0,0,0,0,1]这表明您的成分列表不包含单独列表元素中的每个成分。该列表包含一个元素,在单个字符串中包含所有成分。所以你需要做的是把这个字符串分成不同的成分。我已经更新了答案。看一看。我的代码只会告诉你如何做。在不知道整个场景的情况下,很难给出准确的通用解决方案。您也可以尝试使用“字符串标记器”来拆分条目,如果可以的话,这对我很有帮助,问题几乎解决了。非常感谢!最受欢迎的是,这是为其中一种配料做的。我从数据库中提取配料,上面的代码是针对所有配方配料完成的,我希望每次解析配方列表时都这样做。而(rs.next()){String nrRet=rs.getString(“Ingrediente”);//request.setAttribute(“Ehealth”,datalist);firstList.add(nrRet);}我希望在每次解析数据库表的一行时都能完成,而不是像现在这样解析完之后
for (String temp2 : secondList) {
        boolean isTrue = false;
        for (String temp : firstList) {
            if (temp.contains(temp2)) {
                isTrue = true;
                break;
            }
        }
        if (isTrue)
            al4.add(1);
        else
            al4.add(0);
    }