2016-06-09 33 views
0

給定有向圖的字典,表示嵌套組及其成員,返回給定組的所有用戶。從有向圖形詞典構建組

示例 -

Hashmap- 

key|Values 

Group1- [ Group3, Group5, User8, User2] 
Group2 -[ Group1, User9] 
Group3 -[ Group4, User5] 
Group4 -[ User1, User3] 
Group5 -[ User4, User7] 

O/P應該是:

group1 : [User1, User3,User5, User4, User7,User8, User2] 
group2 : [User1, User3,User5, User6, User7,User8, User9] 
group3: [User1, User3,User5] 
group4: [User1, User3] 
group5: [User4, User7] 

我已經在例如遞歸函數的各種方式嘗試過,但我剛剛結束了抓我的頭。

public static void main(String[] args) { 
     HashMap<String, List<String>> hmap = new HashMap<String,List<String>>(); 
     List<String> l1 = new ArrayList<String>(); 
     List<String> l2 = new ArrayList<String>(); 
     List<String> l3 = new ArrayList<String>(); 
     List<String> l4 = new ArrayList<String>(); 
     List<String> l5 = new ArrayList<String>(); 
     l1.add("group3"); l1.add("group5"); l1.add("user8"); l1.add("user2"); 
     l2.add("group1"); l2.add("user9"); 
     l3.add("group4"); l3.add("user5"); 
     l4.add("user1"); l4.add("user3"); 
     l5.add("user4"); l5.add("user9"); 
     hmap.put("group1",l1); 
     hmap.put("group2",l2); 
     hmap.put("group3",l3); 
     hmap.put("group4",l4); 
     System.out.println(hmap); 
     flatten(hmap); 

    } 


    public static void flatten(HashMap<String, List<String>> hmap){ 
     ArrayList<String> groups = new ArrayList<String>(); 
     for(Entry<String,List<String>> entryset : hmap.entrySet()){ 
      groups.add(entryset.getKey()); 
     } 
     System.out.println(groups); 
     for(Entry<String,List<String>> entryset : hmap.entrySet()){ 
      String s1 = entryset.getKey(); 
      //HashSet<String> set1 = new HashSet<String>(); 
      ArrayList<String> values = new ArrayList<String>(); 
      values.addAll(entryset.getValue()); 

     } 
+0

給我們的是什麼,你都試過請 – jr593

+0

歡迎StackOverflow的一些例子。請閱讀並遵守幫助文檔中的發佈準則。 [最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。在您發佈代碼並準確描述問題之前,我們無法有效幫助您。 StackOverflow不是一個編碼或教程服務。 – Prune

+0

我的代碼已被添加。 – Anish

回答

0

這裏是一個辦法做到這一點使用斯卡拉:

def run(): Unit = 
{ 
    /* Simply initializing the given data into User and Group classes */ 
    val (u1, u2, u3, u4) = (new User("u1"), new User("u2"), new User("u3"), new User("u4")) 
    val (u5, u6, u7, u8, u9) = (new User("u5"), new User("u6"), new User("u7"), new User("u8"), new User("u9")) 
    val g5 = new Group(List(u4, u7)) 
    val g4 = new Group(List(u1, u3)) 
    val g3 = new Group(List(g4, u5)) 
    val g1 = new Group(List(g3, g5, u8, u2)) 
    val g2 = new Group(List(g1, u9)) 

    /* Put the groups into a list */ 
    var groups = List(g1, g2, g3, g4, g5) 

    /* Map/loop over each group, calling `resolveItems` on each */ 
    groups = groups.map{_.resolveItems} 

    /* Print out each of the resolved groups */ 
    groups.foreach{println} 
} 

/* A simple class representing the Group entity */ 
case class Group(var items: List[Any]) 
{ 
    /* 
     Returns a new group by recursively resolving the items 
     in this group into only users 
    */ 
    def resolveItems: Group = 
    { 
     new Group(this.items.map{ 
      // If the item is a group, resolve it into users 
      case g: Group => g.resolveItems 
      // If the item is a user, just move along 
      case u: User => u 
     }.distinct) 
    } 

    /* Override to string for pretty printing */ 
    override 
    def toString: String = items.mkString(", ") 
} 

/* Simply class representing the user entity */ 
case class User(val name: String) 
{ 
    override 
    def toString : String = name 
} 

輸出:

u1, u3, u5, u4, u7, u8, u2 
u1, u3, u5, u4, u7, u8, u2, u9 
u1, u3, u5 
u1, u3 
u4, u7 
+0

謝謝evan058的代碼。遺憾的是我從來沒有使用過scala。請你解釋一下上面代碼中使用的邏輯嗎?我真的很感激它 – Anish

+0

我添加了一些註釋,希望能解釋一些東西 –