Cách đơn giản để tìm nếu hai danh sách khác nhau chứa chính xác các yếu tố?


253

Cách đơn giản nhất để tìm nếu hai Danh sách chứa chính xác các phần tử giống nhau, trong các thư viện Java tiêu chuẩn là gì?

Sẽ không có vấn đề gì nếu hai Danh sách có cùng thể hiện hay không và không thành vấn đề nếu tham số loại của Danh sách khác nhau.

ví dụ

List list1
List<String> list2; 
// ... construct etc

list1.add("A");
list2.add("A"); 
// the function, given these two lists, should return true

Có lẽ có điều gì đó nhìn chằm chằm vào mặt tôi biết :-)


EDIT: Để làm rõ, tôi đã tìm kiếm các yếu tố CHÍNH XÁC và số lượng các yếu tố theo thứ tự.


Các yếu tố phải theo cùng một thứ tự?
Michael Myers

Điều này có thể không bao giờ ảnh hưởng đến bạn nhưng hãy cẩn thận rằng các bộ liên tục ngủ đông đôi khi không tôn trọng hợp đồng bằng nhau - tìm kiếm xem opensource.atlassian.com/projects/hibernate/browse/HHH-3799
Pablojim

Câu trả lời:


367

Nếu bạn quan tâm đến thứ tự, thì chỉ cần sử dụng phương thức bằng:

list1.equals(list2)

Từ javadoc:

So sánh các đối tượng được chỉ định với danh sách này cho bình đẳng. Trả về true nếu và chỉ khi đối tượng được chỉ định cũng là một danh sách, cả hai danh sách có cùng kích thước và tất cả các cặp phần tử tương ứng trong hai danh sách đều bằng nhau. (Hai phần tử e1 và e2 bằng nhau nếu (e1 == null? E2 == null: e1.equals (e2)).) Nói cách khác, hai danh sách được xác định là bằng nhau nếu chúng có cùng các phần tử theo cùng một thứ tự . Định nghĩa này đảm bảo rằng phương thức bằng hoạt động đúng trong các triển khai khác nhau của giao diện Danh sách.

Nếu bạn muốn kiểm tra độc lập với thứ tự, bạn có thể sao chép tất cả các thành phần vào Bộ và sử dụng bằng trên Bộ kết quả:

public static <T> boolean listEqualsIgnoreOrder(List<T> list1, List<T> list2) {
    return new HashSet<>(list1).equals(new HashSet<>(list2));
}

Một hạn chế của phương pháp này là nó không chỉ bỏ qua trật tự, mà còn tần suất của các yếu tố trùng lặp. Ví dụ, nếulist1 là ["A", "B", "A"] và list2là ["A", "B", "B"] thì Setcách tiếp cận sẽ coi chúng là bằng nhau.

Nếu bạn cần không nhạy cảm với thứ tự nhưng nhạy cảm với tần suất trùng lặp, bạn có thể:


54
Bạn không thể sử dụng chứa AllAll nếu bạn muốn kiểm tra độc lập với đơn hàng?
laz

6
Tôi không biết về các chi tiết triển khai của chứa AllAll, nhưng có vẻ như nó có thể xấu. Nếu chứa tất cả các cuộc gọi chứa () nhiều lần, bạn sẽ có một O (n ^ 2) alg. Các bộ tổng thể phải là O (nlogn)
Tom

6
Trên thực tế, nếu các tập hợp sẽ là O (nlogn), một cách tiếp cận khác là gọi Collections.sort () trong danh sách, sau đó sử dụng bằng. Nếu bạn muốn giữ trật tự mặc dù, bạn sẽ cần phải sao chép danh sách, và điều đó có thể tốn kém và ủng hộ giải pháp đã đặt ... vì vậy bạn phải suy nghĩ về tình huống của mình :-).
Tom

1
@amischiefr: bạn có gợi ý O (n ^ 2) là cách tốt nhất bạn có thể làm không?
Tom

8
@Dennis Kiểm tra kích thước thực sự chỉ hoạt động nếu bạn biết rằng mỗi danh sách chỉ chứa các yếu tố riêng biệt. Ví dụ, được cung cấp a = [x, y, x]b = [x, y, z]sau đó các kích thước bằng nhau và b.containsAll(a)sẽ trả về true, nhưng bchứa một phần tử không nằm trong a.
Laurence Gonsalves

95

Tôi đã đăng một loạt các công cụ trong các bình luận Tôi nghĩ rằng nó đảm bảo câu trả lời của riêng mình.

Như mọi người nói ở đây, sử dụng bằng () phụ thuộc vào thứ tự. Nếu bạn không quan tâm đến thứ tự, bạn có 3 lựa chọn.

lựa chọn 1

Sử dụng containsAll(). Theo tôi, tùy chọn này không lý tưởng, vì nó cung cấp hiệu suất trường hợp xấu nhất, O (n ^ 2).

Lựa chọn 2

Có hai biến thể cho điều này:

2a) Nếu bạn không quan tâm đến việc duy trì thứ tự danh sách của bạn ... hãy sử dụng Collections.sort()trên cả hai danh sách. Sau đó sử dụng equals(). Đây là O (nlogn), vì bạn thực hiện hai loại và sau đó là so sánh O (n).

2b) Nếu bạn cần duy trì thứ tự của danh sách, bạn có thể sao chép cả hai danh sách trước. THEN bạn có thể sử dụng giải pháp 2a trên cả hai danh sách được sao chép. Tuy nhiên điều này có thể không hấp dẫn nếu sao chép rất tốn kém.

Điều này dẫn đến:

Lựa chọn 3

Nếu yêu cầu của bạn giống như phần 2b , nhưng sao chép quá đắt. Bạn có thể sử dụng một TreeSet để sắp xếp cho bạn. Kết xuất mỗi danh sách vào TreeSet của chính nó. Nó sẽ được sắp xếp trong tập hợp, và các danh sách ban đầu sẽ vẫn còn nguyên. Sau đó thực hiện equals()so sánh trên cả hai TreeSets. Các TreeSetss có thể được xây dựng trong thời gian O (nlogn) vàequals() O (n).

Bạn chọn đi :-).

EDIT: Tôi gần như quên mất lời cảnh báo tương tự mà Laurence Gonsalves chỉ ra. Việc thực hiện TreeSet sẽ loại bỏ các bản sao. Nếu bạn quan tâm đến các bản sao, bạn sẽ cần một số loại sắp xếp nhiều trang.


Nếu bạn quan tâm đến các bản sao, bạn luôn có thể kiểm tra kích thước của các bộ sưu tập bằng nhau trước bất kỳ thử nghiệm nào khác.
laz

Cụ thể hơn, nếu có các bản sao cho thấy sự bất bình đẳng, kích thước của các danh sách phải giống nhau trước khi bất kỳ kiểm tra bình đẳng nào có cơ hội thành công.
laz

7
@laz: kiểm tra kích thước sẽ không hoạt động nếu các yếu tố khác nhau được sao chép trong hai danh sách. ví dụ: [A, A, B] vs [A, B, B] có kích thước bằng nhau.
Laurence Gonsalves

@Laurence: Tôi đồng ý rằng bài đăng của laz hơi khó hiểu (tôi đã đọc nó một vài lần trước khi tôi hiểu nó). Tôi tin rằng anh ta chỉ đang cố gắng cung cấp một "phím tắt" cho trường hợp đặc biệt khi có 2 điều kiện: (1) trùng lặp vấn đề và (2) kích thước danh sách là khác nhau. Trong ví dụ của bạn, tôi nghĩ rằng laz vẫn nói rằng cần phải thực hiện tất cả các kiểm tra giống như chúng ta đã thảo luận. (Ít nhất đó là cách tôi đọc nó). Nếu trùng lặp KHÔNG quan trọng, thì bạn không thể sử dụng kích thước làm kiểm tra trường hợp đặc biệt. Nhưng khi 2 điều kiện giữ, bạn chỉ có thể nói "if (list1.size ()! = List2.size ()) trả về false;.
Tom

9
Chứa tất cả tôi sẽ đưa ra câu trả lời sai, bạn sẽ cần phải chứaTất cả hai cách. a.containsAll(b) && b.containsAll(a)
Richard Tingle

24

Nếu bạn đang sử dụng (hoặc rất vui khi sử dụng) Bộ sưu tập Apache Commons, bạn có thể sử dụng CollectionUtils.isEqualCollection , "trả về đúng nếu các Bộ sưu tập đã cho chứa chính xác các yếu tố có cùng chính xác."


Thực hiện dựa trên hashmap rất đẹp. Thời gian chạy phải là O (n) và nếu có nhiều phần tử lặp lại, nó sử dụng bộ nhớ tối thiểu để theo dõi (về cơ bản theo dõi tần số (cardinality) của các phần tử bằng cách sử dụng bản đồ cho mỗi bộ sưu tập). Nhược điểm là nó có sử dụng bộ nhớ O (n) bổ sung.
Muhd

17

Rất muộn cho bữa tiệc nhưng muốn thêm kiểm tra an toàn null này:

Objects.equals(list1, list2)

8

Tôi biết đây là một chủ đề cũ, nhưng không có câu trả lời nào khác giải quyết hoàn toàn trường hợp sử dụng của tôi (tôi đoán Guava Multiset có thể làm tương tự, nhưng không có ví dụ nào ở đây). Xin thứ lỗi cho định dạng của tôi. Tôi vẫn còn mới để đăng trên stack trao đổi. Ngoài ra, hãy cho tôi biết nếu có bất kỳ lỗi nào

Hãy nói rằng bạn có List<T>a và List<T>b và bạn muốn kiểm tra xem chúng có bằng các điều kiện sau không:

1) O (n) thời gian chạy dự kiến
2) Bình đẳng được định nghĩa là: Với tất cả các phần tử trong a hoặc b, số lần phần tử xảy ra trong a bằng số lần phần tử xảy ra trong b. Bình đẳng phần tử được định nghĩa là T.equals ()

private boolean listsAreEquivelent(List<? extends Object> a, List<? extends Object> b) {
    if(a==null) {
        if(b==null) {
            //Here 2 null lists are equivelent. You may want to change this.
            return true;
        } else {
            return false;
        }
    }
    if(b==null) {
        return false;
    }
    Map<Object, Integer> tempMap = new HashMap<>();
    for(Object element : a) {
        Integer currentCount = tempMap.get(element);
        if(currentCount == null) {
            tempMap.put(element, 1);
        } else {
            tempMap.put(element, currentCount+1);
        }
    }
    for(Object element : b) {
        Integer currentCount = tempMap.get(element);
        if(currentCount == null) {
            return false;
        } else {
            tempMap.put(element, currentCount-1);
        }
    }
    for(Integer count : tempMap.values()) {
        if(count != 0) {
            return false;
        }
    }
    return true;
}

Thời gian chạy là O (n) vì chúng tôi đang thực hiện chèn O (2 * n) vào một hashmap và hashmap O (3 * n) chọn. Tôi chưa kiểm tra đầy đủ mã này, vì vậy hãy cẩn thận :)

//Returns true:
listsAreEquivelent(Arrays.asList("A","A","B"),Arrays.asList("B","A","A"));
listsAreEquivelent(null,null);
//Returns false:
listsAreEquivelent(Arrays.asList("A","A","B"),Arrays.asList("B","A","B"));
listsAreEquivelent(Arrays.asList("A","A","B"),Arrays.asList("A","B"));
listsAreEquivelent(Arrays.asList("A","A","B"),null);

5

Hãy thử phiên bản này không yêu cầu thứ tự giống nhau nhưng không hỗ trợ có nhiều giá trị giống nhau. Chúng chỉ khớp nhau nếu mỗi cái có cùng số lượng của bất kỳ giá trị nào.

public boolean arraysMatch(List<String> elements1, List<String> elements2) {
    // Optional quick test since size must match
    if (elements1.size() != elements2.size()) {
        return false;
    }
    List<String> work = newArrayList(elements2);
    for (String element : elements1) {
        if (!work.remove(element)) {
            return false;
        }
    }
    return work.isEmpty();
}

work.remove (phần tử) là O (n), vì vậy giải pháp này là O (n ^ 2)
Andrew

Hoặc O (n1 * n2) giống nhau
Lee Meador

Tôi cũng đã sử dụng chiến lược tương tự vì nó xử lý tất cả các kịch bản và kích thước bộ sưu tập không lớn lắm nên O (n ^ 2) không thành vấn đề
Naresh Joshi

3

Phương thức bằng trong Danh sách sẽ thực hiện việc này, Danh sách được sắp xếp theo thứ tự, do đó, để bằng hai Danh sách phải có cùng các phần tử theo cùng một thứ tự.

return list1.equals(list2);

3
Danh sách không được sắp xếp trừ khi bạn sắp xếp chúng.
Michael Myers

Thở dài @ Chính tôi. Đó là một câu trả lời rõ ràng. Bạn biết rằng đã quá lâu một ngày khi bạn thậm chí không thể Ctrl + F một trang web nữa. :)
Grundlefleck

2
@mmyer: các mục trong danh sách không được đặt hàng trừ khi bạn sắp xếp chúng. Bản thân các danh sách có thứ tự ngầm định các mục (theo chỉ mục), không thay đổi trừ khi bạn thay đổi các mục trong danh sách. (so với Bộ hoặc Bộ sưu tập không đảm bảo thứ tự nhất quán nếu bạn lặp lại qua chúng hai lần)
Jason S

Tôi nghĩ rằng daveb có nghĩa là gì khi nói danh sách được sắp xếp là List.equals đưa thứ tự các yếu tố vào xem xét để xác định sự bình đẳng. Xem Javadoc.
laz

2
Ý tôi là một danh sách chứa {"A", "B"} và một danh sách chứa {"B", "A"} sẽ không đồng đều với phương thức này. Đó rất có thể là những gì được dự định, nhưng tôi muốn chắc chắn rằng không ai đang nhìn nó.
Michael Myers

3

Giải pháp cho trường hợp khi hai danh sách có cùng các yếu tố, nhưng thứ tự khác nhau:

public boolean isDifferentLists(List<Integer> listOne, List<Integer> listTwo) {
    if(isNullLists(listOne, listTwo)) {
        return false;
    }

    if (hasDifferentSize(listOne, listTwo)) {
        return true;
    }

    List<Integer> listOneCopy = Lists.newArrayList(listOne);
    List<Integer> listTwoCopy = Lists.newArrayList(listTwo);
    listOneCopy.removeAll(listTwoCopy);

    return CollectionUtils.isNotEmpty(listOneCopy);
}

private boolean isNullLists(List<Integer> listOne, List<Integer> listTwo) {
    return listOne == null && listTwo == null;
}

private boolean hasDifferentSize(List<Integer> listOne, List<Integer> listTwo) {
    return (listOne == null && listTwo != null) || (listOne != null && listTwo == null) || (listOne.size() != listTwo.size());
}

2
Tôi nghĩ bạn không cần phải sao chép listTwo.
AjahnCharles

1
Bạn cũng có thể lưu ý lý do tại sao bạn sử dụng removeAll()thay vì containsAll()(theo cách hiểu của tôi là nếu listTwo chứa các bản sao được chứa chỉ một lần trong listOne, cách tiếp cận chứa All () sẽ báo cáo không chính xác các danh sách như nhau).
AjahnCharles

3

Câu trả lời của Tom là tuyệt vời Tôi hoàn toàn đồng ý với câu trả lời của anh ấy!

Một khía cạnh thú vị của câu hỏi này là, liệu bạn có cần Listloại chính nó và thứ tự vốn có của nó hay không.

Nếu không, bạn có thể giảm xuống Iterablehoặc Collectioncho phép bạn linh hoạt chuyển qua các cấu trúc dữ liệu được sắp xếp theo thời gian chèn, thay vì tại thời điểm bạn muốn kiểm tra.

Nếu thứ tự không bao giờ có vấn đề (và bạn không có các yếu tố trùng lặp) hãy xem xét sử dụng a Set.

Nếu thứ tự quan trọng nhưng được xác định bởi thời gian chèn (và bạn không có trùng lặp), hãy xem xét một LinkedHashSetthứ giống như TreeSet nhưng được sắp xếp theo thời gian chèn (không được tính trùng lặp). Điều này cũng cung cấp cho bạn O(1)truy cập khấu hao ngay lập tức O(log n).


2

Mã mẫu:

public static '<'T'>' boolean isListDifferent(List'<'T'>' previousList,
        List'<'T'>' newList) {

    int sizePrevoisList = -1;
    int sizeNewList = -1;

    if (previousList != null && !previousList.isEmpty()) {
        sizePrevoisList = previousList.size();
    }
    if (newList != null && !newList.isEmpty()) {
        sizeNewList = newList.size();
    }

    if ((sizePrevoisList == -1) && (sizeNewList == -1)) {
        return false;
    }

    if (sizeNewList != sizePrevoisList) {
        return true;
    }

    List n_prevois = new ArrayList(previousList);
    List n_new = new ArrayList(newList);

    try {
        Collections.sort(n_prevois);
        Collections.sort(n_new);
    } catch (ClassCastException exp) {
        return true;
    }

    for (int i = 0; i < sizeNewList; i++) {
        Object obj_prevois = n_prevois.get(i);
        Object obj_new = n_new.get(i);
        if (obj_new.equals(obj_prevois)) {
            // Object are same
        } else {
            return true;
        }
    }

    return false;
}

2

Ngoài câu trả lời của Laurence, nếu bạn cũng muốn làm cho nó an toàn:

private static <T> boolean listEqualsIgnoreOrder(List<T> list1, List<T> list2) {
    if (list1 == null)
        return list2==null;
    if (list2 == null)
        return list1 == null;
    return new HashSet<>(list1).equals(new HashSet<>(list2));
}

1
Bạn có thể đơn giản hóa việc kiểm tra:if (list1 == null) return list2==null; if (list2 == null) return false;
Xerus

Không hoạt động nếu danh sách là [a, a, b, c] & [a, b, c] và sẽ trả về đúng trừ khi thêm một kiểm tra bổ sung để đảm bảo kích thước của danh sách giống nhau.
Venkat Madhav

2
list1.equals(list2);

Nếu danh sách của bạn chứa Class MyClass tùy chỉnh, lớp này phải ghi đè equalshàm.

 class MyClass
  {
  int field=0;
  @0verride
  public boolean equals(Object other)
        {
        if(this==other) return true;
        if(other==null || !(other instanceof MyClass)) return false;
        return this.field== MyClass.class.cast(other).field;
        }
  }

Lưu ý: nếu bạn muốn kiểm tra bằng với java.util.Set chứ không phải a java.util.List, thì đối tượng của bạn phải ghi đè hashCode hàm.


1
nên dòng: return this.field == MyClass. class.cast (other); được trả về this.field == MyClass. class.cast (other) .field;
vào

@alpere ơi! bạn đúng ! Tôi sẽ sửa nó. Cảm ơn !
Pierre


0

Bạn có thể sử dụng thư viện org.apache.commons.collections của Apache: http://commons.apache.org/collections/apidocs/org/apache/commons/collections/ListUtils.html

public static boolean isEqualList(java.util.Collection list1,
                              java.util.Collection list2)

Điều này cũng đòi hỏi các yếu tố danh sách phải theo cùng một thứ tự.
josh-cain

bạn có thể sắp xếp danh sách trước khi so sánh
David Zhao

Chắc chắn, bạn có thể làm điều đó với điều kiện các loại được lưu trữ trong danh sách hoặc có thể sắp xếp (hoặc bạn có một bộ so sánh được thiết lập). Tuy nhiên, thuật toán triển khai Apache không khác gì list1.equals (list2) thông thường, ngoại trừ tĩnh. Tôi thấy nơi tôi đã hiểu nhầm câu hỏi và thực tế nó đã hỏi làm thế nào để so sánh các mục danh sách theo cùng một thứ tự. Lỗi của tôi!
josh-cain

@DavidZhao: liên kết đã chết.
Aniket Kulkarni


0

Kiểm tra cả hai danh sách không phải là null. Nếu kích thước của chúng là khác nhau, thì những danh sách này không bằng nhau. Xây dựng bản đồ bao gồm các yếu tố của danh sách làm khóa và lặp lại chúng làm giá trị và so sánh các bản đồ.

Giả định, nếu cả hai danh sách đều là null, tôi coi chúng là bằng nhau.

private boolean compareLists(List<?> l1, List<?> l2) {
    if (l1 == null && l2 == null) {
        return true;
    } else if (l1 == null || l2 == null) {
        return false;
    }

    if (l1.size() != l2.size()) {
        return false;
    }

    Map<?, Integer> m1 = toMap(l1);
    Map<?, Integer> m2 = toMap(l2);

    return m1.equals(m2);
}

private Map<Object, Integer> toMap(List<?> list) {
    //Effective size, not to resize in the future.
    int mapSize = (int) (list.size() / 0.75 + 1);
    Map<Object, Integer> map = new HashMap<>(mapSize);

    for (Object o : list) {
        Integer count = map.get(o);
        if (count == null) {
            map.put(o, 1);
        } else {
            map.put(o, ++count);
        }
    }

    System.out.println(map);
    return map;
}

Xin lưu ý, phương thức bằng phải được xác định đúng cho các đối tượng này. https://stackoverflow.com/a/24814634/4587961


1
Bạn đã giả sử một yếu tố không thể xuất hiện một số lần khác nhau trong mỗi danh sách, ví dụ [x, x, y]vs [x, y, y]sẽ trở lại đúng với triển khai của bạn.
AjahnCharles

@CodeConfident, cảm ơn bạn rất nhiều! Tôi cập nhật câu trả lời. Tôi sẽ sử dụng một mao!
Yan Khonski

-2

Nó phụ thuộc vào lớp List cụ thể mà bạn đang sử dụng. Lớp trừu tượng AbstractCollection có một phương thức gọi là chứa All (Bộ sưu tập) lấy một bộ sưu tập khác (Danh sách là một bộ sưu tập) và:

Trả về true nếu bộ sưu tập này chứa tất cả các thành phần trong bộ sưu tập đã chỉ định.

Vì vậy, nếu một ArrayList đang được truyền vào, bạn có thể gọi phương thức này để xem chúng có giống hệt nhau không.

       List foo = new ArrayList();
    List bar = new ArrayList();
    String str = "foobar";

    foo.add(str);
    bar.add(str);

    foo.containsAll(bar);

Lý do cho chứa All () là vì nó lặp qua danh sách đầu tiên tìm kiếm sự trùng khớp trong danh sách thứ hai. Vì vậy, nếu họ không theo thứ tự bằng () sẽ không nhận nó.

EDIT: Tôi chỉ muốn đưa ra nhận xét ở đây về thời gian hoạt động được khấu hao để thực hiện các tùy chọn khác nhau được cung cấp. Thời gian chạy có quan trọng không? Chắc chắn rồi. Đó có phải là điều duy nhất bạn nên xem xét? Không.

Chi phí sao chép MỌI yếu tố duy nhất từ ​​danh sách của bạn vào các danh sách khác đều mất thời gian và nó cũng chiếm một phần bộ nhớ tốt (nhân đôi hiệu quả bộ nhớ bạn đang sử dụng).

Vì vậy, nếu bộ nhớ trong JVM của bạn không phải là vấn đề đáng lo ngại (thường là vậy) thì bạn vẫn cần xem xét thời gian cần thiết để sao chép mọi phần tử từ hai danh sách vào hai TreeSets. Hãy nhớ rằng nó đang sắp xếp mọi yếu tố khi nó đi vào chúng.

Lời khuyên cuối cùng của tôi? Bạn cần xem xét tập dữ liệu của mình và số lượng phần tử bạn có trong tập dữ liệu của mình và mức độ lớn của từng đối tượng trong tập dữ liệu của bạn trước khi bạn có thể đưa ra quyết định tốt ở đây. Chơi xung quanh với chúng, tạo từng cái một và xem cái nào chạy nhanh hơn. Đó là một bài tập tốt.


2
Nó sẽ không phải là foo.contains ALL (bar) && bar.contains ALL (foo); ?
Carl Manaster

Không, nó đi qua mọi phần tử trong foo và xem thanh có chứa phần tử đó không. Sau đó, nó đảm bảo rằng độ dài là giống nhau của hai danh sách. Nếu với mỗi foo có một phần tử trong thanh sao cho foo.element == bar.element và foo.length == bar.length thì chúng chứa các phần tử giống nhau.
amischiefr

chúng ta có biết có đảm bảo hiệu quả không? hay đây thường là O (n ^ 2)?
Tom

Giống như bất kỳ mảng nào khác lặp đi lặp lại thông qua việc tìm kiếm một phần tử phù hợp, thời gian chạy tệ nhất sẽ là O (n ^ 2). Trong trường hợp này, có vẻ như việc triển khai thực sự lặp lại thông qua một yếu tố tại một thời điểm tìm kiếm sự phù hợp. Tôi sẽ không suy đoán về thời gian chạy được khấu hao, nhưng có trường hợp xấu nhất là O (n ^ 2).
amischiefr

1
Điều này không hoạt động: {1,2,2} .contains ALL ({1,1,2}) và ngược lại, và hai danh sách có cùng kích thước.
comco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.