2013-07-19 4 views
0

У меня есть следующий код:Foreach цикл внутри цикла Еогеасп (Java)

Set<TOrganization> organizations = new LinkedHashSet<TOrganization>(); 
Set<TRole> roles = new LinkedHashSet<TRole>(); 
StringBuilder message = new StringBuilder("Requested roles: " + "\n"); 

//I fill them up with names like Test org A, Test Role A 1 

for(TOrganization org : organizations) { 
    message.append(" - " + org.getName()+ "\n"); 
    for(TRole role : roles) { 
     if(role.getOrganization().equals(org)) { 
      message.append(" - " + role.getName()+ "\n"); 
     } 
    } 
} 

Я хочу напечатать роли в отдельных категориях, что-то вроде этого:

"- Тест орг "
" - Тест Роль А 1"
"- Роль Тест A 2"
"- Тест орг Б"
"- Тест Роль B 1"
"- Тест Роль B 2"

Но мой код всегда добавляет название организации до роли, как это:

"- Тест орг А"
"- Тест Роль 1"
"- Тест орг A"
"- Тест Роль А 2"
"- Тест орг Б"
"- Тест Роль B 1"
"- Тест орг Б"
"- Тест Роль B 2"

Кажется message.append(" - " + org.getName()+ "\n"); запускается на выполнение, когда проходит второй цикл. Как это возможно?

Редактировать: Я тестировал его с помощью printlns, но имена ролей в порядке. Я не касался equals() или hashcode(), я просто сравниваю строки с equals(). Проблема в том, что имена org добавляются в сообщение для каждой принадлежащей им роли, когда они должны появляться только один раз.

+3

Возможно, если у вас есть только одна роль для каждой организации. Вы правильно заменили «hashCode» и «equals»? – Kevin

+7

Пройдите через свой код или добавьте printlns; некоторые предположения, которые вы делаете, неверны. Начните, где вы * добавите * данные. –

+2

@Kevin Или, вернее, он переопределил 'hashcode' и' equals' неправильно? (Так как их реализация вообще не будет реализована) – CorayThan

ответ

1

Это работает

class TOrganization { 

    private String name; 

    public TOrganization(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj != null && obj instanceof TOrganization) { 
      if (((TOrganization) obj).getName().equals(name)) { 
       return true; 
      } 
     } 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     return super.hashCode(); 
    } 

} 

class TRole { 

    private TOrganization organization; 
    private String name; 

    public TRole(TOrganization organization, String name) { 
     this.organization = organization; 
     this.name = name; 
    } 

    public TOrganization getOrganization() { 
     return organization; 
    } 

    public String getName() { 
     return name; 
    } 

} 

public static void main(String[] args) { 
    Set<TOrganization> organizations = new LinkedHashSet<TOrganization>(); 
    Set<TRole> roles = new LinkedHashSet<TRole>(); 
    StringBuilder message = new StringBuilder("Requested roles: " + "\n"); 

    TOrganization orga = new TOrganization("Test org A"); 
    TOrganization orgb = new TOrganization("Test org B"); 

    organizations.add(new TOrganization("Test org A")); 
    organizations.add(new TOrganization("Test org B")); 
    roles.add(new TRole(orga, "Test Role A 1")); 
    roles.add(new TRole(orga, "Test Role A 2")); 
    roles.add(new TRole(orgb, "Test Role B 1")); 
    roles.add(new TRole(orgb, "Test Role B 2")); 

    for (TOrganization org : organizations) { 
     message.append(" - " + org.getName() + "\n"); 
     for (TRole role : roles) { 
      if (role.getOrganization().equals(org)) { 
       message.append(" - " + role.getName() + "\n"); 
      } 
     } 
    } 
    System.out.println(message.toString()); 
} 

Выход

Requested roles: 
- Test org A 
    - Test Role A 1 
    - Test Role A 2 
- Test org B 
    - Test Role B 1 
    - Test Role B 2 

Ваши петли работают, вы снимаете исправления своих классов

+0

Проблема заключалась в сравнении родительской организации. Мне удалось это исправить. Всем спасибо! Отмечая это как принятый ответ. – Elopteryx

0

Вы должны назначить roles во внешнем контуре (так, что она меняется, когда org изменяется)

for(TOrganization org : organizations) { 
    message.append(" - " + org.getName()+ "\n"); 

    // like this, you adapt ;) 
    roles = org.getRoles(); 

    for(TRole role : roles) { 
     if(role.getOrganization().equals(org)) { 
      message.append(" - " + role.getName()+ "\n"); 
     } 
    } 
} 

редактировать: вы должны сделать Set<TRole> roles = new LinkedHashSet<TRole>(); член TOrganization IMO

+0

К сожалению, это не то, что я ищу, извините, если я не понял. Я не хочу печатать все роли, только запрошенные, (они поступают с jsp-страницы в качестве параметров запроса). Изменение набора роли - плохая идея. – Elopteryx

+0

ouch! my bad: x –

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