2012-05-01 33 views
14

Tôi đang so sánh hai danh sách trong Dart như thế này:Làm cách nào tôi có thể so sánh Danh sách để bình đẳng trong Dart?

main() { 
    if ([1,2,3] == [1,2,3]) { 
     print("Equal"); 
    } else { 
     print("Not equal"); 
    } 
} 

Nhưng họ không bao giờ bằng nhau. Dường như không có phương thức bằng() trong API Dart để so sánh Danh sách hoặc Bộ sưu tập. Có cách nào thích hợp để làm việc này không?

+0

thể dupe của http://stackoverflow.com/questions/19713572/how-do-i-compare-two-lists-as-being-equal-and-containing-the-same-objects -in-da –

Trả lời

20

Để hoàn thành câu trả lời Gunter của: cách khuyến khích để so sánh danh sách cho sự bình đẳng (chứ không phải là bản sắc) là bằng cách sử dụng các lớp học bình đẳng từ gói sau

import 'package:collection/collection.dart'; 

Chỉnh sửa: trước 1.13, nó là gói 'nhập khẩu: collection/equality.dart';

Ví dụ:,

Function eq = const ListEquality().equals; 
print(eq([1,'two',3], [1,'two',3])); // => true 

Các bản in trên true vì các phần tử danh sách tương ứng là identical(). Nếu bạn muốn (sâu) so sánh danh sách có thể chứa các bộ sưu tập khác sau đó thay vì sử dụng:

Function deepEq = const DeepCollectionEquality().equals; 
List list1 = [1, ['a',[]], 3]; 
List list2 = [1, ['a',[]], 3]; 
print( eq(list1, list2)); // => false 
print(deepEq(list1, list2)); // => true 

Có các lớp học bình đẳng khác có thể được kết hợp bằng nhiều cách, trong đó có sự bình đẳng cho Map s. Bạn thậm chí có thể thực hiện một có thứ tự (sâu) so sánh bộ sưu tập:

Function unOrdDeepEq = const DeepCollectionEquality.unordered().equals; 
List list3 = [3, [[],'a'], 1]; 
print(unOrdDeepEq(list2, list3)); // => true 

Để biết chi tiết thấy package API documentation. Như thường lệ, để sử dụng một gói phần mềm như vậy, bạn phải liệt kê nó trong pubspec.yaml của bạn:

dependencies: 
    collection: any 
+0

Cảm ơn bạn đã tham khảo DeepCollectionEquality. Nó xóa một số thông tin cho peons của tôi. – Fallenreaper

6

Bộ sưu tập trong Dart không có sự bình đẳng vốn có. Hai bộ không bằng nhau, ngay cả khi chúng chứa chính xác các đối tượng giống như các phần tử.

collection library cung cấp các phương pháp để xác định sự bình đẳng như vậy. Trong trường hợp này, đối với ví dụ

IterableEquality().equals([1,2,3],[1,2,3]) 

là bình đẳng xem xét hai danh sách giống hệt nhau nếu chúng chứa các phần tử giống hệt nhau.

+0

Vui lòng xem thêm câu trả lời bên dưới, hiện có các cách để thực hiện. –

0

Điều gì đó có thể phù hợp với bạn?

try { 
    Expect.listEquals(list1, list2); 
    } catch (var e) { 
    print("lists aren't equal: $e"); 
    } 

Ví dụ:

main() { 
    List<int> list1 = [1, 2, 3, 4, 5]; 
    List<int> list2 = new List.from(list1); 
    try { 
    Expect.listEquals(list1, list2); 
    } catch (var e) { 
    print("lists aren't equal: $e"); 
    } 
    list1.removeLast(); 
    try { 
    Expect.listEquals(list1, list2); 
    } catch (var e) { 
    print("Lists aren't equal: $e"); 
    } 
} 

Second in thử:

Lists aren't equal: Expect.listEquals(list length, expected: <4>, actual: <5>) fails 
+0

Đây có phải là lớp Equal được định nghĩa trong API không? Tôi không thể theo dõi nó xuống nếu nó được. Dường như nó sẽ có ý nghĩa nhất đối với các lớp này để lộ ra một toán tử hoặc phương thức để so sánh sự bình đẳng với Dart sau đó sẽ sử dụng với toán tử ==. –

+0

Đồng ý. Nó thực sự là lớp Expect trong phi tiêu: core. Thật kỳ lạ, trừ khi tôi hiểu sai nó, các bình luận trong Expect.listEquals nói rằng điều này khác với kiểm tra chuẩn cho sự bình đẳng được sử dụng bởi việc thực hiện danh sách, như bạn và Lars đã chỉ ra, dường như không tồn tại thực sự. – scribeGriff

1

Trước khi mọi thứ làm việc, bạn có thể sử dụng này:

/** 
    * Returns true if the two given lists are equal. 
    */ 
    bool _listsAreEqual(List one, List two) { 
    var i = -1; 
    return one.every((element) { 
     i++; 

     return two[i] == element; 
    }); 
    } 
2

Trong khi câu hỏi này là khá cũ, tính năng vẫn chưa hạ cánh tự nhiên trong Dart. Tôi đã có một nhu cầu để so sánh bình đẳng sâu (List<List>), vì vậy tôi mượn từ trên cao bây giờ với cuộc gọi đệ quy:

bool _listsAreEqual(list1, list2) { 
var i=-1; 
return list1.every((val) { 
    i++; 
    if(val is List && list2[i] is List) return _listsAreEqual(val,list2[i]); 
    else return list2[i] == val; 
}); 
} 

Lưu ý: đây vẫn sẽ thất bại khi trộn các loại Bộ sưu tập (ví dụ List<Map>) - nó chỉ bao gồm List<List<List>> và như vậy.

Vấn đề phi tiêu mới nhất về vấn đề này có vẻ là https://code.google.com/p/dart/issues/detail?id=2217 (cập nhật lần cuối tháng 5 năm 2013).

Các vấn đề liên quan