2012-08-30 24 views
7

Tôi vẫn là một người mới trong EMF nên có lẽ câu hỏi của tôi không thực sự có ý nghĩa hoặc tôi giả định những điều sai trái.Làm thế nào để so sánh sự bình đẳng giữa EObject khi chúng chứa EList không có thứ tự?

Tôi đang làm việc trên một dự án hướng mô hình, vì vậy tôi đã xác định một mô hình biến thể sinh thái và tạo mã liên kết. Bây giờ tôi đang cố gắng để thực hiện các bài kiểm tra đơn vị và tôi cần để có thể kiểm tra sự bình đẳng giữa các đối tượng và đặc biệt hơn giữa các đối tượng mở rộng EObject.

Tôi đã cố gắng sử dụng EcoreUtil.equals() để thực hiện các phép thử nhưng nó luôn trả về false vì các đối tượng của tôi chứa các tham chiếu trong danh sách (lớp EList) không được sắp xếp theo cùng một cách. Tuy nhiên, tôi xác định rõ ràng trong metamodel của tôi rằng tài liệu tham khảo không được đặt hàng: Tôi muốn sử dụng chúng giống Set hơn Danh sách. Vì vậy, cuối cùng tôi đã quyết định thực hiện các phương thức equals của riêng mình trong lớp Impl của tôi, ngay cả khi nó được khuyến khích trong javadoc, nhưng nó có cách khác, thanh lịch hơn, để kiểm tra sự bình đẳng về cấu trúc giữa các đối tượng EMF mà không tham gia vào tài khoản thứ tự của danh sách?

Cảm ơn!

Trả lời

2

Bạn có thể triển khai lớp tiện ích của riêng mình, nơi bạn viết mã so sánh của riêng bạn cho các danh sách không theo thứ tự bằng phương pháp mặc định EObject.

Bạn có thể căn cứ triển khai của mình trong EqualityHelper.equals(List list1, List list2) sử dụng danh sách "chứa" thay vì theo chỉ mục theo phương pháp đó.

0

tôi đã viết những phương pháp hữu ích sau đây trong Xtend:

static def boolean equalsTo(Set<? extends EObject> eObjectSet1, Set<? extends EObject> eObjectSet2) { 
    contains(eObjectSet1, eObjectSet2) && contains(eObjectSet2, eObjectSet1) 
} 

static def boolean contains(Set<? extends EObject> eObjectSet1, Set<? extends EObject> eObjectSet2) { 
    eObjectSet1.forall[eObject1 | eObjectSet2.exists[eObject2 | EcoreUtil.equals(eObject1, eObject2)]] 
} 
+0

Tôi không biết Xtend, nhưng với tôi có vẻ như dòng mã này không tính đến yếu tố trùng lặp xem xét trong danh sách. Vì vậy, '[1]' và '[1, 1, 1]' sẽ được báo cáo bằng nhau. – Lii

0

này có thể có thể được giải quyết bằng cách sử dụng một EMap, với các phần tử của danh sách cựu như chìa khóa và một loại khác tùy ý, ví dụ EString, làm giá trị.

Nếu phần tử phải nằm trong tập hợp, hãy ánh xạ nó thành chuỗi rỗng.

EMap<SomeClass, EString> someSet; 

Nếu danh sách có thể chứa nhiều phần tử, ánh xạ tới và số nguyên cung cấp số phần tử.

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