兩個List比較內容是否一樣

2021-08-18 11:57:18 字數 2829 閱讀 8107

一段進行對兩個list進行比較的**。

/**

* 首先進行入參檢查防止出現空指標異常

* 如果兩個引數都為空,則返回true

* 如果有一項為空,則返回false

* 接著對第乙個list進行遍歷,如果某一項第二個list裡面沒有,則返回false

* 還要再將兩個list反過來比較,因為可能乙個list是兩乙個list的子集

* 如果成功遍歷結束,返回true

*@param l0

*@param l1

*@return

*/public

static

boolean

islistequal(list l0, list l1)

for (object o : l1)

return

true;

}

這種比較可以成功比較兩個內容相同但是元素順序不同的list。 

比較關鍵的是使用了list.contains()方法,這個方法是個介面。以arraylist為例,看一下arraylist裡的實現:

* returns true

if this list

contains

the specified element.

* more formally, returns true

ifand only if this list

contains

* at least one element e such that

* (o==null ? e==null : o.equals(e)).

** @param o element whose presence in this list

isto be tested

* @return

true

if this list

contains

the specified element

*/public boolean

contains(object o)

/*** returns the index of

thefirst occurrence of

the specified element

* in this list, or -1

if this list

does not contain

the element.

* more formally, returns the lowest index i such that

* (o==null ? get(i)==null : o.equals(get(i))),

* or -1

if there is no such index.

*/public int indexof(object o) else

return -1;

}contains()返回的是indexof(object o)是否大於0的boolean值。indexof(object o)返回的結果是目標物件的下標值。 

elementdata是arraylist裡的object的陣列,elementdata的宣告(為什麼將型別定為transient 不太明白):

// non-private to simplify nested class access

transient object elementdata;

首先看indexof()方法,當目標object為空時,返回elementdata中第乙個為空元素的下標。否則如果目標object不為空,呼叫object的equals()方法,返回第乙個相等元素的下標。 

當上述兩種情況都能找到相應元素時,下標肯定都是大於等於0的,如果沒找到的話返回-1。 

因此當contains()只需判斷indexof()的返回值是否大於等於0就可以判斷該list是否包含目標元素。

但是這種簡單的判斷兩個list內容是否一樣的**有乙個問題,因為最終的元素的比較依賴於equals()方法。當list裡的元素沒有重寫equals()方法時,這個判斷的結果是不準確的。

class aa

}arraylist l0 = new arraylist();

l0.add(new aa("aaa"));

l0.add(new aa("bbb"));

arraylist l1 = new arraylist();

l1.add(new aa("aaa"));

l1.add(new aa("bbb"));

system.out.println(islistequal(l0, l1));

上述**應該返回的結果為true,但實際返回的結果為false。 

}為aa類重寫equals()後再次執行返回結果正常。 

1.凡涉及到物件的比較是否相同時,確保實現了equals()方法,以免發生意外。 

2.該判斷方法的**只針對包含了實現了equals的物件的list。

arraylist裡的elementdata欄位為什麼要加transient 關鍵字

交換兩個長度一樣的陣列的內容

交換兩個陣列的內容,也就是將兩個陣列內的各個元素對應交換,可以將兩個陣列一一遍歷,如果下標相等,則交換,否則不交換,具體 實現如下 include include int main int arr2 int i 0 int j 0 int n 0 int m 0 for i 0 i sizeof a...

python比較兩個list

自己寫的,耗時很長。當兩個list是100000級別長度的資料時,需要好幾分鐘 if jpg not in list2 paython自帶方法。速度很快 list3 list set3 初始化資料 lista zhangsan lisi wangwu listb zhangsan lisi zhao...

兩個list比較相等

public static void main string args 使用 org.apache.commons.collections4 listutils.isequallist list1,list2 注意 使用listutils.isequallist 方法是區分順序的,順序不一樣也不相等...