2013-07-19 457 views
0

我有以下代碼:的foreach循環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"); 
     } 
    } 
} 

我想打印出不同類別的角色,這樣的事情:

「 - 測試組織一個「
」 - 測試角色A 1"
「 - 測試角色A 2」
「 - 測試組織B」
「 - 測試角色乙1」
「 - 測試角色B 2」

但我的代碼總是附加組織名稱的角色之前,像這樣:

「 - 測試ORG A」
「 - 測試角色A 1」
「 - 測試ORG A」
「 - 測試角色A 2」
「 - 測試組織B」
「 - 測試角色乙1」
「 - 測試組織B」
「 - 測試角色B 2」

似乎message.append(" - " + org.getName()+ "\n");在第二個循環運行時執行。這怎麼可能?

編輯:我用printlns測試了它,但角色名稱沒有問題。我沒有碰到equals()或hashcode(),我只是比較字符串與equals()。問題是組織名稱會被附加到郵件中,因爲每個角色只能出現一次。

+3

如果您每個組織只有一個角色,則可能會出現這種情況。你是否正確地重寫了'hashCode'和'equals'? – Kevin

+7

逐步通過您的代碼或添加printlns;你所做的一些假設是不正確的。開始你添加數據的地方。 –

+2

@Kevin或者說,他是否不恰當地重寫'hashcode'和'equals'! (因爲沒有執行它們就沒有問題。) – CorayThan

回答

1

Set<TRole> roles = new LinkedHashSet<TRole>();這是工作

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

編輯:你應該讓會員TOrganization IMO

+0

不幸的是,這不是我正在尋找的,對不起,如果我不清楚。我不想打印出所有的角色,只有要求的角色(來自jsp頁面的請求參數)。更改設置角色是一個壞主意。 – Elopteryx

+0

哎!我的不好:x –