比較兩個List的內容是否相等

1、問題java

如今有兩個ArrayList列表,列表中的元素是String字符串。比較這兩個列表中的內容相等(能夠順序不一致)。如:3d

List<String> lsit1 = new ArrayList<>();
    List<String> lsit2 = new ArrayList<>();

    list1.add("1");
    list1.add("1");
    list1.add("3");
    list1.add("2");
           
    list2.add("1");
    list2.add("3");
    list2.add("2");
    list2.add("2");

先貼上最終解決的代碼:code

public booelan equalsList(List<String> list1, List<String> list2){
            // null狀況
            if ( (list1 == null && list2 != null) 
                 || (list1 != null && list2 == null) ) {
                return false;
            }
    
            // 大小比較
            if (list1.size() != list2.size) {
            return false;
            }
            String[] arr1 = list1.toArray(new String[]{});
            String[] arr2 = list2.toArray(new String[]{});
            Arrays.sort(arr1);
            Arrays.sort(arr1);
            return Arrays.equals(arr1,arr2);
    }

2、解決過程對象

首先能夠想到的是,先null狀況和兩個列表size的比較。blog

  • 若是隻有一個列表爲空,那麼確定不相等;
  • 若是兩個列表的size不相等,那麼這兩個列表的內容一定不相等
// null狀況
    if (list1 == null) {
        return list2 == null;
    }
    
    // 大小比較
    if (list1.size() != list2.size) {
        return false;
    }

大小和Null的狀況已經判斷完了。如今的兩個列表一定是兩個不爲空且大小相等的列表。也就是說,如今只要比較內容是否都相同(忽略順序)就能夠了。有人認爲能夠用contains 或者 containsAll來解決,如:排序

  • 使用contains()
for (String str : list1) {
         if (!list2.contains(str)) {
            return false;
        }
    }
    return true;

或者接口

  • 使用containsAll()
if (lsit1.containsAll(list2) && list2.containsAll(list1)) {
         return true;   
    }
    return false;

 

可是使用這二者方法都是用問題的,由於ArrayList中的元素可重複的。因此若是list1中爲{"1","1","3","2"},list2中爲{"1","3","2","2"},這個時候上面兩種辦法結果都會爲true,顯示這兩個列表是不相同的。由於containsAll()中仍是調用了contains方法。字符串

使用contains和containsAll更適合與去重後的列表進行比較。可是這裏的比較是不去重且無序的,因此不能用這個辦法。hash

說到無序,大概就可能知道該怎麼解決了。既然是無序的,那就把這兩個list的內容排序再逐個的進行比較不就能夠了?因此,Arrys.sort(),Arrays,equals(),就排上了用場。it

String[] arr1 = list1.toArray(new String[]{});
    String[] arr2 = list2.toArray(new String[]{});
    Arrays.sort(arr1);
    Arrays.sort(arr1);
    return Arrays.equals(arr1,arr2); //這裏能夠本身遍歷,可是明顯使用Arrays.equals()方法更加的方便。

3、注意事項

可是須要注意的是,使用Arrys.sort(),Arrays,equals(),List中存放的對象必須實現了Comparable接口並重寫了compareTo()方法和equals()方法。由於Arrays.sort()和Arrays.equals()會調用類的compareTo方法和equals()方法。

上面的例子使用的是String類型,String類型中已經實現了Comparable接口並重寫了compareTo()方法和equals()方法以及hashCode()方法。

若是List中存放的類沒有實現comparable接口,在使用Arrays.sort()是會拋出異常 java.lang.ClassCastException: XXX  cannot be cast to java.lang.Comparable。

若是隻實現了Comparable接口並重寫了compareTo()方法,可是沒有重寫equals()和hashCode()方法。會致使結果一直爲false,覺得他比較的是兩個對象的地址。因此在使用list比較時最好使用String 這種已經實現了Comparable接口的並已經重寫了compareTo()、equals()、hashCode()方法的類比較方便。

相關文章
相關標籤/搜索