在Java中迭代具有多个条件的ArrayList

时间:2011-02-08 22:48:22

标签: java arraylist iterator

场景:包含以下DTO的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");

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

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。如何构建返回这些结果的查询?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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的阵列吗?不会。但是,它会返回符合您的过滤条件的文章ID列表。如果需要,您可以轻松扩展它以返回dtos列表。

答案 2 :(得分:0)

这是一个糟糕的数据结构。像Map<Long,Map<Field, String>>这样的东西要好得多,其中Long是articleId,Field是字段名称的枚举,String是字段值。对于查询,您还可以维护字段/值对到ids的逆映射。

或者更好的是,在ORM / JPA框架中完成所有这些工作,让DBMS为您完成所有艰苦的工作。