【问题标题】:Comparing an ArrayList of ArrayLists to an ArrayList将 ArrayList 的 ArrayList 与 ArrayList 进行比较
【发布时间】:2014-12-07 09:40:20
【问题描述】:

在下面的示例中,我将如何比较 ArrayList al4 的内容与其他 ArrayLists 的内容?以同样的方式,我将al1al2 进行了比较。

import java.util.ArrayList;

public class Details {
    public static void main(String[] args) {
        ArrayList<String> al1 = new ArrayList<String>();
        al1.add("hi");
        al1.add("How are you");
        al1.add("Good Morning");
        al1.add("bye");
        al1.add("Good night");

    ArrayList<String> al2 = new ArrayList<String>();
    al2.add("Howdy");
    al2.add("Good Evening");
    al2.add("bye");
    al2.add("Good night");

    ArrayList<ArrayList<String>> al4 = new ArrayList<ArrayList<String>>();
    al4.add(al1);

    // Storing the comparison output in ArrayList<String>
    ArrayList<String> al3 = new ArrayList<String>();
    for (String temp : al1)
        al3.add(al2.contains(temp) ? "Yes" : "No");
    System.out.println(al3);

    }
}

al3 的输出

[No, No, No, Yes, Yes]

【问题讨论】:

    标签: java arraylist compare contains


    【解决方案1】:

    这有点取决于你的意思。您不能直接al4al2 进行比较,因为它们属于不同类型:一种是ArrayList&lt;String&gt;,一种是ArrayList&lt;ArrayList&lt;String&gt;&gt;

    当您比较al1al2 时,您要做的是确定al1 的每个元素是否出现在al2任何地方。我想这就是你想要的。您决定它是否出现在 al2 的同一个地方。

    您应该做的第一件事是改进这种比较,这是相当低效的。由于您不关心al2 的排序,您应该像这样重写比较:

    ArrayList<String> al3 = new ArrayList<String>();
    Set<String> al2set = new HashSet<String>(al2);
    for (String temp : al1)
        al3.add(al2set.contains(temp) ? "Yes" : "No");
    

    这样效率更高,因为您不必为每次查找遍历整个 al2

    现在,如果您想将列表列表与列表进行比较,我只能假设您的意思是您想判断 al4 中任何列表的每个元素是否出现在 al2 .如果是这样,那么你想要

    ArrayList<String> al3 = new ArrayList<String>();
    Set<String> al2set = new HashSet<String>(al2);
    for (List<String> tempList : al4)
        for (String temp : tempList)
            al3.add(al2set.contains(temp) ? "Yes" : "No");
    

    这将为您提供一个平面ArrayList&lt;String&gt;,记录al4 列表中的每个元素,该元素是否位于al2 某处。

    您可能希望结果为ArrayList&lt;ArrayList&lt;String&gt;&gt;,以便结果模仿al4 的结构,在这种情况下,它只会稍微复杂一点:

    ArrayList<ArrayList<String>> al3list = new ArrayList<ArrayList<String>>();
    Set<String> al2set = new HashSet<String>(al2);
    for (List<String> tempList : al4) {
        ArrayList<String> al3 = new ArrayList<String>();
        for (String temp : tempList)
            al3.add(al2set.contains(temp) ? "Yes" : "No");
        al3list.add(al3);
    }
    

    执行此操作后,a3list 将具有与al4 相同的结构,并且每个列表的每个元素将是"Yes""No",这取决于al4 中的对应元素是否包含在某处在al2

    【讨论】:

    • 出色而透彻的解释。非常感谢,我真的很感激!
    • 在本例中,当我将另一个 ArrayList 添加到 al4 时,在执行时似乎将前一个索引的副本添加到下一个索引,以及应该存储的正确值在那个索引中。
    • @user2988501 我不确定我是否理解您的意思。我给出的代码将处理al4整个。您想向al4 添加一个新列表,然后只处理最后一点吗?如果我误解了您要执行的操作,您可能需要举一个例子。
    • 是的,我将如何编辑 for 循环,这样如果我在 'al4' 中添加另一个 'ArrayList' 就不会导致 'al3list' 中出现重复值。
    • 我想通了,我的括号放错地方了!
    【解决方案2】:

    您可以创建这样的方法。

    public static boolean[] compare(ArrayList<String> al1, ArrayList<String> al2) {
    
            boolean result[] = new boolean[al1.size()]; // result
    
            int i = 0;  // index
    
            /*
             * Test if an element of al1 occurs in al2
             */
            for(String s : al1) {
                if(al2.contains(s)) {
                    result[i] = true;
                }
                else {
                    result[i] = false;
                }
                i++;    // increment
            }
    
            return result; 
        }
    

    然后你就可以调用这个方法并显示结果了

    boolean result[] = compare(al1, al2);
    
    for(int i = 0; i < result.length; i++)  {
        System.out.print(result[i] + " ");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-10
      • 2018-11-12
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2020-07-30
      相关资源
      最近更新 更多