2011-02-08 135 views
0

场景:包含以下DTO的Arraylist。在Java中使用多个条件迭代ArrayList

MetadatRetrievalDTO[] dto = new MetadatRetrievalDTO[16]; 

dto[0] = new MetadatRetrievalDTO(); 
dto[0].setArticleId(11); 
dto[0].setBaseId("SB11"); 
dto[0].setMetadataName("TYPE"); 
dto[0].setMetadataValue("RANCH"); 

dto[1] = new MetadatRetrievalDTO(); 
dto[1].setArticleId(11); 
dto[1].setBaseId("SB11"); 
dto[1].setMetadataName("PRICE"); 
dto[1].setMetadataValue("1200000"); 

dto[2] = new MetadatRetrievalDTO(); 
dto[2].setArticleId(11); 
dto[2].setBaseId("SB11"); 
dto[2].setMetadataName("STATE"); 
dto[2].setMetadataValue("NJ"); 

dto[3] = new MetadatRetrievalDTO(); 
dto[3].setArticleId(11); 
dto[3].setBaseDocId("SB11"); 
dto[3].setMetadataName("REGION"); 
dto[3].setMetadataValue("NE"); 
////////////////////////////////////////////////////// 
dto[4] = new MetadatRetrievalDTO(); 
dto[4].setArticleId(12); 
dto[4].setBaseId("SB12"); 
dto[4].setMetadataName("TYPE"); 
dto[4].setMetadataValue("RANCH"); 

dto[5] = new MetadatRetrievalDTO(); 
dto[5].setArticleId(12); 
dto[5].setBaseId("SB12"); 
dto[5].setMetadataName("PRICE"); 
dto[5].setMetadataValue("1200001"); 

dto[6] = new MetadatRetrievalDTO(); 
dto[6].setArticleId(12); 
dto[6].setBaseId("SB12"); 
dto[6].setMetadataName("STATE"); 
dto[6].setMetadataValue("NJ"); 

dto[7] = new MetadatRetrievalDTO(); 
dto[7].setArticleId(12); 
dto[7].setBaseId("SB12"); 
dto[7].setMetadataName("REGION"); 
dto[7].setMetadataValue("NE"); 

////////////////////////////////////////////////////// 
dto[8] = new MetadatRetrievalDTO(); 
dto[8].setArticleId(13); 
dto[8].setBaseId("SB13"); 
dto[8].setMetadataName("TYPE"); 
dto[8].setMetadataValue("RANCH"); 

dto[9] = new MetadatRetrievalDTO(); 
dto[9].setArticleId(13); 
dto[9].setBaseId("SB13"); 
dto[9].setMetadataName("PRICE"); 
dto[9].setMetadataValue("1200002"); 

dto[10] = new MetadatRetrievalDTO(); 
dto[10].setArticleId(13); 
dto[10].setBaseId("SB13"); 
dto[10].setMetadataName("STATE"); 
dto[10].setMetadataValue("NJ"); 

dto[11] = new MetadatRetrievalDTO(); 
dto[11].setArticleId(13); 
dto[11].setBaseId("SB13"); 
dto[11].setMetadataName("REGION"); 
dto[11].setMetadataValue("NE"); 


////////////////////////////////////////////////////// 
dto[12] = new MetadatRetrievalDTO(); 
dto[12].setArticleId(14); 
dto[12].setBaseId("SB14"); 
dto[12].setMetadataName("TYPE"); 
dto[12].setMetadataValue("RANCH"); 

dto[13] = new MetadatRetrievalDTO(); 
dto[13].setArticleId(14); 
dto[13].setBaseId("SB14"); 
dto[13].setMetadataName("PRICE"); 
dto[13].setMetadataValue("1200003"); 

dto[14] = new MetadatRetrievalDTO(); 
dto[14].setArticleId(14); 
dto[14].setBaseId("SB14"); 
dto[14].setMetadataName("STATE"); 
dto[14].setMetadataValue("NH"); 

dto[15] = new MetadatRetrievalDTO(); 
dto[15].setArticleId(14); 
dto[15].setBaseId("SB14"); 
dto[15].setMetadataName("REGION"); 
dto[15].setMetadataValue("NE"); 

其中BaseIDs每篇文章都是唯一的。搜索条件是:

HashMap<String,String> queryParams = new HashMap<String, String>(); 
    queryParams.put("TYPE","RANCH"); 
    queryParams.put("STATE","NJ"); 
    queryParams.put("REGION","NE"); 

我用魔杖获得所有满足queryParams的DTO。 因此,所需的ArrayList应具有与queryParams匹配的所有记录,因此在我的情况下,它应该排除基本ID = SB14的最后一篇文章,因为在本文中StateNH。我如何构建一个返回这些结果的查询?

+4

这里有什么问题? – 2011-02-08 22:50:52

回答

0

您可能需要重新考虑你的数据结构。您目前设置他们的方式,创建高效搜索将非常困难。如果我明白你在找什么,下面的代码应该得到你想要的结果:

private Set filter(MetadatRetrievalDTO[] data, Map<String, String> filter) { 
     Set<Integer> rtnIdSet = new HashSet(); 
     for (MetadatRetrievalDTO dto : data) { 
      rtnIdSet.add(dto.getArticleId()); 
     } 

     Set<Integer> filterSet = new HashSet(); 
     for (String key : filter.keySet()) { 
      filterSet.clear(); 
      String value = filter.get(key); 
      for (MetadatRetrievalDTO dto : data) { 
       if (key.equals(dto.getMetadataName()) && value.equals(dto.getMetadataValue())) { 
        filterSet.add(dto.getArticleId()); 
       } 
      } 

      rtnIdSet.retainAll(filterSet); 
     } 

     return rtnIdSet; 
    }

这是优化的吗?不。它是否返回DTO的Array?但是,它确实会返回符合您的过滤条件的文章ID列表。如果您愿意,您可以轻松扩展它以返回dtos列表。

+0

感谢您的答案克里斯,我知道使用的数据结构并不是最优的,但这是遗留代码,我正在进行更改以适应一些小的要求。 – SMG 2011-02-09 15:47:46

0
for (MetadatRetrievalDTO dto : dtos) { 
    for (Map.Entry entry : queryParams.entrySet()) { 
     if (dto.getMetadataName().equals(entry.getKey()) && dto.getMetadataValue().equals(entry.getValue())) { 
      // dto matches 
     } 
    } } 

不知道这是否你的意思......但你应该考虑的索引或类似的东西...

0

这是一个可怕的数据结构。类似Map<Long,Map<Field, String>>会好得多,其中Long是articleId,Field是字段名称的枚举,String是字段值。对于查询,您还可以维护字段/值对到ID的逆映射。

或者,甚至更好的是,在ORM/JPA框架中完成所有这些工作,并让数据库管理系统为您完成所有工作。