2010-02-03 12 views
2

각 목록 레코드가 데이터베이스 행인 데이터베이스를 나타내는 List<HashMap<String,Object>>이 있습니다.중복 목록을 HashMap 항목 목록에서 제거

데이터베이스에 10 개의 열이 있습니다. 2 개의 특정 열의 값이 같은 행이 여러 개 있습니다. 목록이 데이터베이스의 모든 행으로 업데이트 된 후 목록에서 중복을 제거해야합니다.

효율적인 방법은 무엇입니까?

FYI - 데이터베이스로드 후 GroupName이 나중에 Map에 추가되므로 데이터베이스를 쿼리하는 동안 고유 한 작업을 수행 할 수 없습니다. Id 열이 기본 키가 아니기 때문에 일단 GroupName을 Map에 추가하면됩니다. Id + GroupName 조합에 따라 복제본을 갖게됩니다!

희망 사항은 제 질문에 의미가 있습니다. 더 많은 설명이 필요하면 알려주세요.

+0

질문 : 제거해야 할 항목과 보관해야하는 항목은 무엇입니까? – BalusC

+0

왜 처음부터 복제물을 삽입하나요? 내말은, 삽입하는 동안 복제본을 확인하는 게 어때? – 3lectrologos

+0

나는 내 질문에 이미 그 이유를 말했다.HashMap의 값은 데이터베이스의 초기로드 후에 업데이트됩니다. 그래서 내가 처음부터 중복 조건을 적용 할 수있는 이유가 있습니다. – jagamot

답변

3
  1. HashMaps을 비교하는 비교기를 작성하고 관심있는 키/값 쌍을 비교하여 비교합니다
  2. 사용 Collections.sort(yourlist, yourcomparator)을.;
  3. 이제 비교기에 따라 서로 비슷한 모든 맵이 목록에서 인접합니다.
  4. 새 목록을 만드십시오.
  5. 첫 번째 목록을 반복하여 마지막으로 본 내용을 추적하십시오. 현재 값이 마지막 값과 다른 경우이 값을 새 목록에 추가하십시오.
  6. 새로운 목록에는 비교 자에 따라 중복 된 내용이 없어야합니다.

목록을 통한 반복 비용은 O (n)입니다. 정렬은 O (n log n)입니다. 따라서이 알고리즘은 O (n log n)입니다.

비교기를 사용하여 TreeSet을 사용하여 즉석에서 정렬 할 수도 있습니다. 삽입물은 O (log n)입니다. 그리고 우리는 이것을 n 번해야합니다. 그래서 우리는 O (n log n)을 얻습니다.

+0

내 목록에 1 백만 개가 넘는 행이 있어도이 솔루션이 효율적이기를 바랍니다! – jagamot

+1

HashMap이 포함 된 대부분의 컬렉션에서 중복 객체를 간단하게 제거() 할 수 있습니다. HashMap에서는 remove() 키를 전달합니다. 따라서 중복 목록이나지도가 필요하지 않습니다. – jonescb

+4

Java 메모리에서 행하는 1 백만 행은 무엇입니까? 왜 당신은 실제로 Java 메모리에서 DB를 복제하고 있습니까? 문제는 다른 곳에서 해결되어야한다고 생각합니다. Java의 메모리 대신 DB에서 곧바로 업데이트하고 중복을 방지하기 위해 제약 조건을 사용하십시오. – BalusC

1

은 내가 Employee 클래스 을 촬영하고 정수, 키 - 값 쌍으로 Employee 객체와지도를 만든 여기

Map<Integer,Employee> map = new HashMap<Integer,Employee>(); 

Employee 클래스 내지도 빈 클래스입니다 그것은 이름, ID와 같은 속성이 있습니다 ,지정; 지도가 고유 키를 허용합니다. 그러나 맵에 중복 값 을 허용하고 싶지 않다면 bean 클래스에서 오버라이드 메소드를 사용해야합니다.

@Override 
public boolean equals(Object object){ 
    if (object == null) return false; 
    if (object == this) return true; 
    if (this.getClass() != object.getClass())return false; 
    Employee employee = (Employee)object; 
    if(this.hashCode()== employee.hashCode())return true; 
    return false; 
} 

및 키 - 값을 추가하는 동안 당신이 사용해야하는지도하는이 방법을 포함

if(!map.containsValue(map.get(id))){ 
    map.put(id,employee); 
} 

containsValue 내부적으로 equals() 메소드를 호출 따라서 타고 이상 당신이 모든 값 (객체)와를 확인합니다 방법과 동일 이전 객체 및 해시 코드가 동일한 경우 true를 반환하면 둘 다 같은 객체입니다.