2015-07-19 15 views
7

Nếu chúng ta có thực thể Sinh viên và Khóa học và mối quan hệ giữa chúng rất nhiều, nghĩa là Học sinh có thể học nhiều khóa và nhiều sinh viên có thể tham gia khóa học. Nếu chúng ta phải đại diện cho mối quan hệ này thì cấu trúc dữ liệu tốt nhất thông qua đó chúng ta có thể đại diện cho mối quan hệ này là gì. Nếu chúng ta sử dụng hashmap với sinh viên làm khóa và danh sách các khóa học mà sinh viên lấy làm giá trị thì chúng ta cần một hashmap khác mà qua đó chúng ta có thể biểu diễn khóa học cho mối quan hệ của sinh viên. Có cách nào tốt nhất để đại diện cho mối quan hệ này để tìm kiếm nhanh không.Cấu trúc dữ liệu để đại diện cho nhiều mối quan hệ

+1

thể trùng lặp của [Java nhiều nhiều bản đồ liên kết] (http://stackoverflow.com/questions/2571652/ java-many-to-many-association-map), [Cấu trúc mô hình theo nhiều mối quan hệ] (http://stackoverflow.com/questions/14219954/model-structure-in-many-to-many-relationship) – rid

+0

http://stackoverflow.com/questions/473862/is-there-a-many-to-many-collection-in-java-using-generics-domain-model-not-per – assylias

+0

Cây là những gì bạn cần ở đây –

Trả lời

1

Một đồ thị hai chiều có thể được sử dụng để thực hiện nhiều-nhiều mối quan hệ trong đó mỗi nút có thể được kết nối với nhiều nút khác

0

Tôi nghĩ đó là thích hợp để sử dụng một sự kết hợp của cấu trúc dữ liệu. Dưới đây là một ví dụ nhỏ:

public class ManyToManyMap<S, C> { 
    private Map<S, Set<C>> firstToSecondMap = new HashMap<>(); 

    private Map<C, Set<S>> secondToFirstMap = new HashMap<>(); 

    public void put(S first, C second) { 
     if (!firstToSecondMap.containsKey(first)) { 
      firstToSecondMap.put(first, new HashSet<>()); 
     } 
     firstToSecondMap.get(first).add(second); 

     if (!secondToFirstMap.containsKey(second)) { 
      secondToFirstMap.put(second, new HashSet<>()); 
     } 
     secondToFirstMap.get(second).add(first); 
    } 

    public Set<C> getFirst(S first) { 
     return firstToSecondMap.get(first); 
    } 

    public Set<S> getSecond(C second) { 
     return secondToFirstMap.get(second); 
    } 

    public Set<C> removeByFirst(S first) { 
     Set<C> itemsToRemove = firstToSecondMap.remove(first); 
     for (C item : itemsToRemove) { 
      secondToFirstMap.get(item).remove(first); 
     } 

     return itemsToRemove; 
    } 

    public Set<S> removeBySecond(C second) { 
     Set<S> itemsToRemove = secondToFirstMap.remove(second); 
     for (S item : itemsToRemove) { 
      firstToSecondMap.get(item).remove(second); 
     } 

     return itemsToRemove; 
    } 
} 

Và đây là một cách sử dụng ví dụ:

ManyToManyMap<String, String> mmMap = new ManyToManyMap<>(); 

mmMap.put("Tom", "Math"); 
mmMap.put("Tom", "Java"); 
mmMap.put("Tom", "Java"); 
mmMap.put("Mary", "Java"); 

Set<String> coursesByStudent = mmMap.getFirst("Tom"); // Java, Math 
Set<String> studentByCourse = mmMap.getSecond("Java"); // Tom, Mary 

mmMap.removeByFirst("Tom"); 
studentByCourse = mmMap.getSecond("Java"); // Mary 
Các vấn đề liên quan