的foreach循环foreach循环中(Java)的

的foreach循环foreach循环中(Java)的

问题描述:

我有以下代码:的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

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

你必须在外环分配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 –