为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白板的微信 2022-05-12 18:39:24
如何比较两个不同大小的数组列表并检查元素的顺序?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 的共同元素,但没有给我“订单”。我还可以做些什么?for循环使用:list1.contains(list2.get(i)))但这只是比较值,不检查顺序。while带循环的迭代器:Iterator<String> List1_Iterator = List1.iterator();while (List1_Iterator.hasNext()) {}这也不检查元素的顺序。
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

您也可以按照您的步骤执行这个简单的过程。1)比较元素。2)比较顺序。


import java.util.*;

class Stack1

{

    public static void main(String args[])

    {

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

        list.add("First");

        list.add("name");

        list.add("is");

        list.add("Jay");


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

        list2.add("First");

        list2.add("name");      

        list2.add("is");

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

    }

}


查看完整回答
反对 回复 2022-05-12
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

一种方法是首先创建一个名为 2 的列表的副本list2Copy,然后删除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;


查看完整回答
反对 回复 2022-05-12
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

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;

    }


查看完整回答
反对 回复 2022-05-12
  • 3 回答
  • 0 关注
  • 311 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号