2015-07-19 52 views
7

如果我們有學生和課程實體,並且它們之間的關係是多對多的,即學生可以採取許多課程,許多學生可以採取課程。如果我們必須表達這種關係,那麼我們可以通過哪種最佳數據結構來表示這種關係。如果我們將hashmap和student一起用作關鍵和學生作爲價值的課程列表,那麼我們需要另一個hashmap,通過它我們可以表示課程與學生的關係。有沒有什麼最好的方式來表達這種關係,以便搜索速度很快。代表多對多關係的數據結構

+1

可能重複[Java的多對多關聯圖](http://stackoverflow.com/questions/2571652/ java-many-to-many-association-map),[模型結構在多對多關係中](http://stackoverflow.com/questions/14219954/mo​​del-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

樹是你在這裏需要的 –

回答

1

的雙向圖表可用於實現多到多的關係,其中每個節點可以連接到許多其它節點

0

我認爲這是適合使用的數據結構的組合。這裏是一個小例子:

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; 
    } 
} 

而且這裏有一個例子用法:

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