2015-02-16 3 views
1

У меня есть список User s, каждый со списком их Group s. Что-то вроде этого:Добавить элементы в ArrayList, которые находятся внутри LinkedHashMap [Android]

John -->[GroupA] 

Peter --> [GroupB, GroupC] 

Bob --> [GroupC] 

Tom --> [GroupA,GroupB] 

Jack --> [] 

Тогда у меня есть свой собственный список групп:

Me -->[GroupA, GroupB, GroupC]. 

Так что я хочу, чтобы поместить пользователей в «ведро», который соответствует их группам с моим. Если у пользователя нет групп, они будут добавлены в группу Generic в списке. Таким образом, результат должен быть что-то вроде:

Контакты:

{ GroupA:[John, Tom], GroupB:[Peter, Tom], GroupC:[Peter, Bob], Generic:[Jack]} 

Так что я проверить что-то вроде этого, но он генерирует дублированные значения на LinkedHashMap, и я не знаю, как ее решить.

private void createVoidCollection() { 
      groupsCollections = new LinkedHashMap<String, List<RosterEntry>>(); 
      ArrayList<RosterEntry> contacts = new ArrayList<RosterEntry>(); 
      for (String group : groupList) { 
       groupsCollections.put(group, contacts); 

      } 
     } 

    private void createContactListCollection() { 
      createVoidCollection(); 

      boolean bAdded = false; 

      //Returns a Collection of USers/contacts 
      Collection<RosterEntry> contacts = mRoster.getEntries(); 

      for (RosterEntry buddy : contacts) { 
       //We get the groups that pertains every contact/user 
       Collection<RosterGroup> buddyGroups = buddy.getGroups(); 
       List<RosterEntry> contactsAux = new ArrayList<RosterEntry>(); 

       for (RosterGroup group : buddyGroups) {  
        //For all the groups of the user, we check if is in some of my groups. If not they will be added to a generic group.   
        if (groupList.contains(group.getName())) { 
         contactsAux = groupsCollections.get(group.getName()); 
         contactsAux.add(buddy); 
         groupsCollections.put(group.getName(), contactsAux); 
         bAdded = true; 
        } 
       } 
       if (!bAdded) { 

        //The generic group is checked if exist or not, to be created if neeeded. 
        if (groupsCollections.containsKey(mBuddGroup)) { 
         contactsAux = groupsCollections.get(mBuddGroup); 
         contactsAux.add(buddy); 
         groupsCollections.put(mBuddGroup, contactsAux); 
        } else { 
         contactsAux.add(buddy); 
         groupsCollections.put(mBuddGroup, contactsAux); 
         groupList.add(mBuddGroup); 
        } 
       } 
       bAdded = false; 

      } 

     } 

Вопрос:

Как я могу решить эту проблему? Есть ли способ сделать это лучше? Список

Мои группы:

DEV-andorraCASS2007 
D40-E30-Kosmos 

Контакты и список группы каждого из них:

User: 
    pruebaopenfire 
     Groups: 
      D40-E30-Kosmos 
User: 
    Diana P 
     Groups: 
      DEV-andorraCASS2007 
      D40-E30-Kosmos 
User: 
    Fabio C 
     Groups: 
      D40-E30-Kosmos 
User: 
    Alejandro 
     Groups: 
      DEV-andorraCASS2007 
User: 
    Jordi C 
     Groups: 
      DEV-andorraCASS2007 
      D40-E30-Kosmos 
User: 
    Mikel S 
     Groups: 
      D40-E30-Kosmos 
User: 
    AAAAA 
     Groups: 
User: 
    Rubén R 
     Groups: 
      DEV-andorraCASS2007 
      D40-E30-Kosmos 
User: 
    Diego M 
     Groups: 
      D40-E30-Kosmos 
User: 
    jfkgl 
     Groups: 
User: 
    Luis T 
     Groups: 
      DEV-andorraCASS2007 
      D40-E30-Kosmos 
User: 
    Melissa Y 
     Groups: 
      D40-E30-Kosmos 
User: 
    Prova Prova 
     Groups: 
      D40-E30-Kosmos 

Результат:

02-16 13:22:13.436: D/TESTINGGROUPS(6056): 
{ 
    DEV-andorraCASS2007=[Diana P: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Diana P: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Alejandro Q: [email protected] [DEV-andorraCASS2007], Mikel S: [email protected] [D40-E30-Kosmos], Rubén R: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Rubén R: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Diego M: [email protected] [D40-E30-Kosmos], Jordi C: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Jordi C: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Luis T: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Luis T: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Prova Prova: [email protected] [D40-E30-Kosmos], pruebaopenfire: [email protected] [D40-E30-Kosmos], Melissa Y: [email protected] [D40-E30-Kosmos], Fabio C: [email protected] [D40-E30-Kosmos]], 

    D40-E30-Kosmos=[Diana P: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Diana P: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Alejandro Quintana: [email protected] [DEV-andorraCASS2007], Mikel Sobradillo Ecenarro: [email protected] [D40-E30-Kosmos], Rubén R: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Rubén R: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Diego M: [email protected] [D40-E30-Kosmos], Jordi C: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Jordi C: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Luis T: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Luis T: [email protected] [DEV-andorraCASS2007, D40-E30-Kosmos], Prova Prova: [email protected] [D40-E30-Kosmos], pruebaopenfire: [email protected] [D40-E30-Kosmos], Melissa Y: [email protected] [D40-E30-Kosmos], Fabio C: [email protected] [D40-E30-Kosmos]], 

    Otros Contactos=[jfkgl: jhgfk, AAAAA: [email protected]] 
} 
+0

пожалуйста, покажите результат, что получить в 'LinkedHashMap' с текущей логикой –

+0

я добавил, что вам нужно. – Shudy

+0

уже есть ответ попробовать –

ответ

2

Heres решение с использованием наборов, которые автоматически избежит дублирования:

Map<String, List<String>> userToGroup = new HashMap<String, List<String>>(); 
    userToGroup.put("John", Arrays.asList("GroupA")); 
    userToGroup.put("Peter", Arrays.asList("GroupB", "GroupC")); 
    userToGroup.put("Bob", Arrays.asList("GroupC")); 
    userToGroup.put("Tom", Arrays.asList("GroupA", "GroupB")); 
    userToGroup.put("Jack", Collections.<String> emptyList()); 

    Set<String> myGroups = new HashSet<String>(Arrays.asList("GroupA", "GroupB", "GroupC")); 

    Map<String, Set<String>> groupToUsers = new HashMap<String, Set<String>>(); 
    groupToUsers.put("Generic", new HashSet<String>()); 
    for (String user : userToGroup.keySet()) { 
     List<String> groups = userToGroup.get(user); 
     if (groups.isEmpty()) { 
      groupToUsers.get("Generic").add(user); 
      continue; 
     } 

     for (String group : groups) { 
      if (!myGroups.contains(group)) { 
       continue; 
      } 

      Set<String> userInGroup = groupToUsers.get(group); 
      if (userInGroup == null) { 
       userInGroup = new HashSet<String>(); 
       groupToUsers.put(group, userInGroup); 
      } 

      userInGroup.add(user); 
     } 
    } 

    System.out.println(groupToUsers); 

Выход:

{GroupC=[Bob, Peter], GroupB=[Tom, Peter], GroupA=[Tom, John], Generic=[Jack]} 
+0

Спасибо, продвинутый !, Я собираюсь попытаться что-то сказать ^^ – Shudy

+0

после, адаптироваться к моему коду, он отлично работает! большое спасибо!! – Shudy

Смежные вопросы