2011-05-13 3 views
0

결과 개체의 Java 집합이 있습니다. 내 결과 클래스 정의는 다음과 같습니다 :이집합에 특정 값과 동일한 멤버 변수가 하나있는 개체가 포함되어 있는지 확인하는 방법

키워드 = [ID, URL, 제목, 키워드, 날짜 - 시간]

과 같은 데이터베이스 테이블이라는 키워드에 내 정보를 저장 한

private String url; 
private String title; 
private Set<String> keywords; 

위에서 볼 수 있듯이 개체와 데이터베이스의 행 간에는 일대일 매핑이 없습니다. SQL (MySQL DB)을 사용하여 값을 추출하고 적절한 ResultSet 객체를 갖습니다.

세트에 이미 주어진 URL이 포함되어 있는지 확인하려면 어떻게해야합니까?

집합에 이미 현재 URL이있는 Result 개체가 포함되어 있으면 키워드 집합에 추가 키워드를 추가하기 만하면됩니다. 그렇지 않으면 결과 개체 집합에 추가 할 새 Result 개체를 만듭니다.

답변

0

가능한 경우이 문제를 제거하기 위해 데이터베이스 디자인을 변경하는 것이 좋습니다. ID, URL, 제목 및 날짜 - 시간을 핵심 단어가 많은 경우 상당히 낭비 할 수있는 현재 설계 요구 사항

두 개의 테이블이있는 것이 좋습니다. id 필드가 유일한 것으로 가정하면 첫 번째 테이블은 id, url, title 및 date-time을 저장하며 id 당 하나의 행만 갖습니다. 두 번째 테이블은 ID와 키워드를 저장합니다. 필요에 따라이 테이블에 여러 행을 삽입합니다.

그게 가능합니까/그게 합리적입니까?

+0

그것은 합리적이지만, 쿼리 속도가 느려집니다. 분명한 해결책이 있는지 궁금 해서요. 나는 clunky하지만 작동 뭔가를 함께 넣을 수 있습니다. – Ankur

1

결과 세트를 생성하기 위해 JDBC resultSet을 반복 할 때 왜 맵에 넣지 않습니까? 사실 이후에지도를 만들려면

Map<String, List<Result>> map = new HashMap<String, List<Result>>(); 
for (Result r : resultSet) { 
    if (map.containsKey(r.url)) { 
     map.get(r.url).add(r); 
    } else { 
     List<Result> list = new ArrayList<Result>(); 
     list.add(r); 
     map.put(r.url, list); 
    } 
} 

map.containsKey(url)을 사용하십시오.

0

당신은 키로의 URL과 Map를 사용할 수 있습니다

Map<String, Result> map = new HashMap<String, Result>(); 

for (Result r : results) { 
    if (map.containsKey(r.url)) { 
     map.get(r.url).keywords.addAll(r.keywords); 
    } else { 
     map.put(r.url, r); 
    } 
} 
0

난 당신이 동등한에 재정의 (당신의 결과 클래스의) 방법을 만들 필요가 있다고 생각합니다. 그 방법에서는 당신이 찾고있는 것을 확인하는 당신의 논리를 놓을 것입니다.

N.B. equals() 메소드를 오버라이드 (override) 할 필요가있는 경우, hashCode() 메소드도 오버라이드 (override) 할 필요가 있습니다.

"equals() 및 hashCode() 메소드 재정의"항목에 대해서는 this 다른 질문을 볼 수 있습니다.

관련 문제