2011-02-08 4 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"); 

여기서 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과 일치하는 모든 레코드가 있어야합니다. 따라서이 기사에서는 StateNH이기 때문에 제 경우에는 기본 ID가 SB14 인 마지막 기사를 제외해야합니다. 어떻게 이러한 결과를 반환하는 쿼리를 작성합니까? 이것은 당신이 무엇을 의미하는 경우 ...하지만 당신이 그와 같은 색인 또는 무언가를 고려해야합니다 ... 당신은 당신의 데이터 구조를 다시 생각해야 할 수도 있습니다

+4

여기서 질문은 무엇입니까? –

답변

0

+0

답변 주셔서 고맙습니다. 사용 된 데이터 구조가 최적이 아니라는 것을 알고 있습니다.하지만 이것은 기존 코드 였고 일부 작은 요구 사항에 맞게 변경했습니다. – SMG

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

확실하지. 현재 설정 한 방식대로 효율적인 검색을 만드는 것이 어려울 것입니다. 원하는 코드를 이해하면 다음 코드를 통해 원하는 결과를 얻을 수 있습니다.

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의 목록을 반환하도록 쉽게 확장 할 수 있습니다.

0

이것은 끔찍한 데이터 구조입니다. Map<Long,Map<Field, String>>과 같은 것이 훨씬 더 좋을 것입니다. 여기서 Long은 articleId입니다. Field은 필드 이름의 열거 형이며 String은 필드 값입니다. 쿼리의 경우 필드/값 쌍을 ID에 역 매핑하여 유지할 수도 있습니다.

ORM/JPA 프레임 워크에서이 모든 작업을 수행하고 DBMS가 모든 노력을 기울일 수 있도록하십시오.

관련 문제