Thư viện bộ sưu tập Scala cung cấp các triển khai chuyên biệt cho Bộ ít hơn 5 giá trị (xem source). Các trình vòng lặp cho các triển khai này trả về các phần tử theo thứ tự mà chúng được thêm vào, thay vì thứ tự dựa trên hàm băm nhất quán được sử dụng cho các Bộ lớn hơn.
Hơn nữa, sameElements
(scaladoc) được xác định trên Iterable
s (được triển khai trong IterableLike
- xem source); nó trả về true chỉ khi các trình vòng lặp trả về các phần tử giống nhau trong cùng một thứ tự.
Vì vậy, mặc dù Set(1,2,3)
và Set(3,2,1)
phải là tương đương, vòng lặp của họ là khác nhau, do đó lợi nhuận sameElements
sai.
Hành vi này đáng ngạc nhiên và được cho là lỗi vì vi phạm các kỳ vọng toán học cho một Tập hợp (nhưng chỉ dành cho các kích thước nhất định của Set!).
Như I.K. chỉ ra trong các ý kiến, ==
hoạt động tốt nếu bạn chỉ so sánh các Bộ với nhau, tức là Set(1,2,3) == Set(3,2,1)
. Tuy nhiên, sameElements là tổng quát hơn ở chỗ nó có thể so sánh các phần tử của bất kỳ hai vòng lặp nào. Ví dụ: List(1, 2, 3) == Array(1, 2, 3)
là sai, nhưng List(1, 2, 3) sameElements Array(1, 2, 3)
là đúng.
Tổng quát hơn, bình đẳng thể gây nhầm lẫn - lưu ý rằng:
List(1,2,3) == Vector(1,2,3)
List(1,2,3) != Set(1,2,3)
List(1,2,3) != Array(1,2,3)
Array(1,2,3) != Array(1,2,3)
Tôi có submitted a fix cho Scala exercises giải thích vấn đề sameElements
.
Sử dụng '==' để kiểm tra sự bình đẳng bất kể thứ tự và lặp lại. –
Đó là một điểm tốt để so sánh 'Set's với nhau, mặc dù tôi chỉ nhận thấy rằng' List (1,2,3) == Vector (1,2,3) 'nhưng' List (1,2,3) ! = Đặt (1,2,3) 'và' Danh sách (1,2,3)! = Mảng (1,2,3) 'là một mỏ khác có tiềm năng! – DNA
Và như Paul Draper chỉ ra trong các bình luận bên dưới, 'Array (1,2,3)! = Array (1,2,3)' !! – DNA