如何比较两个不同大小的数组列表并检查元素顺序

时间:2019-01-20 19:59:30

标签: java arraylist

如何比较两个不同大小的数组列表并检查元素的顺序?

1。首先检查ArrayList1是list2的子集

2。第二个检查是ArrayList2与List1具有相同的顺序,而忽略了随机元素

Arraylist1{"this", "is", "a", "coding", "test"};
Arraylist2{"this", "is", "random1", "a", "random2", "coding", "random3", "test"};

如果List2的顺序如下,测试将通过:

"this" "is" "a" "coding" "test" 

如果列表2具有其他任何顺序,则测试将失败:

"a", "is", "coding", "test", "this",或者如果缺少这5个单词中的任何一个。

程序应忽略列表2中任意数量的随机值(例如random1,random2和random3)。

如何实现这种情况?

我尝试了for循环和迭代器。它没有用,他们给了我两个ArrayList的共同元素,但没有给我“顺序”。我还能做什么?

  1. for循环使用:

    list1.contains(list2.get(i)))
    

    但这只是比较值,而不检查顺序。

  2. 带有while循环的迭代器:

    Iterator<String> List1_Iterator = List1.iterator();
    
    
    while (List1_Iterator.hasNext()) {
    }
    

    这也不检查元素的顺序。

5 个答案:

答案 0 :(得分:1)

您还可以按照您的步骤执行此简单过程。 1)比较元素。 2)比较订单。

import java.util.*;
class Stack1
{
    public static void main(String args[])
    {
        ArrayList<String> list=new ArrayList<String>();
        list.add("My");
        list.add("Name");
        list.add("Is");
        list.add("Jay");

        ArrayList<String> list2=new ArrayList<String>();
        list2.add("My");
        list2.add("brother's");     
        list2.add("Name");      
        list2.add("Is");                
        list2.add("Jay");
        list2.add("sudeep");

        ArrayList<String> list3=new ArrayList<String>();            

        for(int i=0;i<list2.size();i++)
        {
            for(int j=0;j<list.size();j++)
            {                       
                if(list2.contains(list.get(j))==true)
                {
                    if(list2.get(i)==list.get(j))
                    {
                        list3.add(list2.get(i));
                    }   
                }
                else{ break; }
            }
        }

        if(list.equals(list3))
        {
            System.out.println("true");
        }
        else{System.out.println("false");}
    }
}

答案 1 :(得分:0)

执行此操作的一种方法是首先创建名为list2Copy的列表2的副本,然后删除list2Copy中不存在的list1中的所有元素。现在,您只需要比较它们是否完全相等即可。

List<Integer> list1 = Arrays.asList(1,3,5);
List<Integer> list2 = Arrays.asList(1,2,3,4,5);
ArrayList<Integer> list2Copy = new ArrayList<>(list2);
list2Copy.removeIf(x -> !list1.contains(x));
return list1.equals(list2Copy);

这是时间复杂度较小的另一种方法:

if (list1.size() > list2.size()) {
    // definitely not same order
    return false;
}

int list1Index = 0;
for (int i = 0 ; i < list2.size() ; i++) {
    if (Objects.equals(list2.get(i), list1.get(list1Index))) {
        list1Index++;
        if (list1Index == list1.size())  {
            return true;
        }
    }
}
// at the end, list1Index should be the same as list1.size() if list2 is in the same order.
return false;

答案 2 :(得分:0)

Arraylist已建立索引,因此,您可以遍历最小的列表,然后通过比较索引处的值来检查是否不匹配。只有当两个列表中的元素顺序正确(一个列表是另一个列表的子集,并且元素以相同的顺序相等)时,执行此操作的方法才会返回true。

private boolean checkForEqualityInorder(List<String> list1, List<String> list2) {
        if (list1.size() < list2.size()) {
            for (int i=0; i <list1.size(); i++){
                if( !list1.get(i).equals(list2.get(i))) {
                    return false;
                }
            }
        } else {
            for (int i=0; i <list2.size(); i++){
                if( !list2.get(i).equals(list1.get(i))) {
                    return false;
                }
            }
        }
        return true;
    }

上述方法接受两个列表,并且仅当一个是另一个的子集(按顺序检查)时才返回true。

增强解决问题的方法:

private boolean checkForEqualityInorder(List<String> list1, List<String> list2) {
        for (int i=0, k=0; i <list1.size(); i++, k++){
            if (list2.get(k).startsWith("random")) {
                i--;
                continue;
            }
            if(!list1.get(i).equals(list2.get(k))) {
                return false;
            }
        }
        return true;
    }

答案 3 :(得分:0)

从第一个列表的第一个元素开始,然后尝试在第二个列表中找到它。如果找到,则将列表2中元素的索引分配给局部变量(indexList2)。然后,您转到第一个列表的第二个元素,并尝试在列表2中找到它,但是您不是从索引0开始,而是从indexList2开始。一直进行下去,直到遍历列表1中的所有元素(并在列表20中找到它们为止->测试成功,否则,测试失败

答案 4 :(得分:0)

public static final BiPredicate<List<String>, List<String>> isHasSameOrder = (one, two) -> {
    Iterator<String> it1 = one.iterator();
    Iterator<String> it2 = two.iterator();

    nextWord:
    while (it1.hasNext()) {
        String word = it1.next();

        while (it2.hasNext())
            if (word.equals(it2.next()))
                continue nextWord;

        return false;
    }

    return true;
};

演示

List<String> one = Arrays.asList("this", "is", "a", "coding", "test");
List<String> two = Arrays.asList("this", "is", "random1", "a", "random2", "coding", "random3", "test");
System.out.println("same order: " + isHasSameOrder.test(one, two)); // true