2015-09-28 158 views
-1

我有一个表,如下所示: “合同”层次结构,以Java对象

company contractor subcontractor 

    intel   x   y 
    intel   x   z 
    intel   x   a 
    intel   y   a 
    intel   y   b 
    intel   p   q 
    intel   p   r 
    intel   q   s 
    googl   m   n 
    googl   n   r 
    googl   n   f 

另一个表 “主要承包商”

company main_contractor 

    intel   x 
    googl   m 

我需要提取从数据这个表格以Java对象或JSON作为使用Java程序的层次结构。

[ 
[Intel, [x, [y, [a,b],z,a]], 

     [p, [q, [s],r]], 
], 
[googl, [m, [n, [[r,f]] 
     ] 
    ] 
] 

如何使用java程序从表中生成这样的分层数据?我没'在SQL中有特殊功能,例如'connect by'或'递归',因为我使用的是Ingres db。

+0

没有发布相关的代码,没有人可以帮你。 Downvoting。您可以参考如何通过检查http://stackoverflow.com/help/how-to-ask来提出问题,以及如何通过阅读以下内容创建示例:http://stackoverflow.com/help/mcve –

回答

0

看起来相当简单,我模拟了一个名称和一组分包商的公司。重写hashCode并等于是平等仅取决于在hashSet中使用的名称。

static class Company { 

    public String getName() { 
     return name; 
    } 

    public Set<Company> getSubcontractors() { 
     return subcontractors; 
    } 
    final String name; 
    final Set<Company> subcontractors = new HashSet<>(); 
    public Company(String name) { 
     this.name = name; 
    }   

    @Override 
    public int hashCode() { 
     int hash = 7; 
     hash = 83 * hash + Objects.hashCode(this.name); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null) { 
      return false; 
     } 
     if (getClass() != obj.getClass()) { 
      return false; 
     } 
     final Company other = (Company) obj; 
     if (!Objects.equals(this.name, other.name)) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "Company{" + "name=" + name + ", subcontractors=" + subcontractors + '}'; 
    } 
} 

创建了公司所有与此对象:

Connection con = DriverManager.getConnection(" ... "); 
PreparedStatement stmt = con.prepareStatement("Select * from main_contractor"); 
ResultSet rs = stmt.executeQuery(); 
Map<String,Company> map = new HashMap<>(); 
List<Company> mainCompanies = new ArrayList<>(); 
while (rs.next()) { 
    String companyName = rs.getString("company"); 
    Company company = new Company(companyName); 
    map.put(companyName, company); 
    mainCompanies.add(company); 
    String mainContractor = rs.getString("main_contractor"); 
    Company contractor = new Company(mainContractor); 
    company.getSubcontractors().add(contractor); 
    map.put(mainContractor, contractor); 
} 
PreparedStatement stmt2 = con.prepareStatement("Select * from contract"); 
rs = stmt2.executeQuery(); 
while (rs.next()) { 
    String contractorName = rs.getString("contractor"); 
    Company contractor = map.containsKey(contractorName)? map.get(contractorName): new Company(contractorName); 
    map.put(contractorName, contractor); 
    String subContractorName = rs.getString("subcontractor"); 
    Company subcontractor = map.containsKey(subContractorName)? map.get(subContractorName): new Company(subContractorName); 
    contractor.getSubcontractors().add(subcontractor); 
    map.put(subContractorName, subcontractor); 
} 

你想最后的输出将只是打印的清单mainCompanies。

+0

非常感谢。你的代码不需要修改。 –

+0

但是,如何正确打印列表主要合同?当我用于(公司c:mainCompanies) \t { \t System.out.println(c.name); \t System.out.println(c.subcontractors); \t \t 为(公司S:c.subcontractors) \t { \t \t 的System.out.println(s.name); \t \t} \t \t},它给了公司名称和主要承包商,那么只有对象ID。如何正确显示整组对象。 –

+0

您可能想要覆盖Company的默认toString()方法以输出比对象ID更有用的内容。用我的IDE的建议编辑答案。 – WillShackleford