簡體   English   中英

如何比較兩個不同大小的數組列表並檢查元素的順序

[英]How to compare two different size arraylists and check for order of elements

如何比較兩個不同大小的數組列表並檢查元素的順序?

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()) { }

    這也不檢查元素的順序。

您也可以按照您的步驟完成這個簡單的過程。 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");}
    }
}

一種方法是首先創建一個名為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;

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

您從第一個列表的第一個元素開始,然后嘗試在第二個列表中找到它。 如果/當您找到它時,您將列表 2 中元素的索引分配給一個局部變量 (indexList2)。 然后轉到第一個列表的第二個元素並嘗試在列表 2 中找到它,但不是從索引 0 開始,而是從 indexList2 開始。 你繼續下去,直到你遍歷了列表 1 中的所有元素(並在列表 20 中找到了它們 --> 測試成功,否則,測試失敗

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM