2012-07-01 2 views
6

내 질문은 : 컬렉션에 추가하고 고유성을 유지할지 여부를 알기 위해 Collection에 숫자가 포함되어 있는지 확인하는 가장 빠른 방법은 무엇입니까? 내가 그것을 도울 수 있다면 나는 목록을 반복하지 않을 것이다.고유 한 정수를 저장하는 좋은 방법

나는 numberList이라고하는 List<Integer>을 가지고 있습니다. 고유 한 정수를 저장하고 복제본을 추가 할 수 없도록하고 싶습니다. 나는 같은 것을 할 싶습니다 :

private void add(int number) { 
    if (!numberList.contains(number)) { 
    numberList.add(number); 
    } 
} 

그러나 분명히이 늘 작업

numberList는 각각의 객체 그래서 관계없이 수의 Integer 개체의 목록이 포함되어 있기 때문이다.

감사합니다.

+0

'contains (...)'메쏘드는 객체의'equals (...)'메쏘드를 사용하여 그것이 콜렉션에 의해 유지되는지 아닌지를 알아 내기 때문에 위의 메쏘드는 중복을 막아야한다고 생각합니다. –

+0

어쩌면 예기치 않은 결과를 내 코드에 내리는 코드가 잘못되었을 수도 있습니다. 팁 고마워! – kentcdodds

+1

코드가 내 것과 비슷한 경우 항상 * 다른 * 다른 오류가 있습니다. 찾는 데 도움이 필요하면 더 많은 정보와 함께 돌아 오십시오! –

답변

12

하나는 정수를 Set<Integer> (예 :)에 저장하는 것입니다. 세트는 중복을 허용하지 않습니다. 또한 편집

는 컬렉션의 contains(...) 방법은 당신이 필요로하는 경우에 그래서 당신의 방법은 위뿐만 아니라 중복을 방지 할 수 있습니다, 그것은 컬렉션 보유 가능 여부를 확인하기 위해 개체의 등호 (...) 메소드를 사용하여 컬렉션으로 List를 사용하는 것. 이걸 직접 시험 해봐. 그러면 그렇게 될거야.

예를 들어

:

List<Integer> numberList = new ArrayList<Integer>(); 
    int[] myInts = {1, 1, 2, 3, 3, 3, 3, 4}; 
    for (int i : myInts) { 
    if (!numberList.contains(i)) { 
     numberList.add(i); 
     } 
    } 

    System.out.println(numberList); 

가 반환합니다 [1, 2, 3, 4]

또한, HashSets 하나의 가능한 문제는 순서가 중요한 경우, 당신이보고 싶을 것이다, 그래서 그들은, 주문하지 않을 것입니다 다른 종류의 정렬 된 세트 중 하나를 사용합니다.

+0

호기심에서 어떤 구현이 더 빠를 것이라고 생각하십니까? 'Set'을 duplicate로 다루거나 추가하기 전에 List에'contains'를 사용하는 것이 더 빠릅니까? – kentcdodds

+0

@ kentcdodds : 해시는 매우 빠른 작업이므로 HashSet은 더 빠를 것이라고 생각하지만, 알고리즘에 대해 큰 O를 공부 한 적이 없기 때문에 100 % 확신 할 수는 없습니다. 하지만 컴퓨터 과학자 중 한 명이 곧 대답 할 것입니다. 의심의 여지가 없습니다. –

+0

팁 주셔서 감사합니다! – kentcdodds

3

가장 컴팩트 한 형식이 BitSet일까요? 무기한으로 확장되므로 저장 측면에서 효율적입니다. 또한 불필요하게 스토리지를 사용하지 않습니다.

멀티 스레드 환경에서 작업하고 있습니까? 그렇다면 더 효율적 일 수있는 다른 구조가 있습니다.

+0

당신은 나를 잡았어! 그것은 멀티 스레딩 환경이기 때문에 이것을 수행합니다. 한 스레드가 이미 번호를 추가했는지 확인하고 싶습니다. – kentcdodds

+0

이 경우에는 거의 확실하게'ConcurrentHashMap'을 찾고 있습니다. 아마도 [newSetFromMap] (http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html)을 사용하여 파생 된 집합으로 래핑됩니다. # newSetFromMap % 28java.util.Map % 29)하지만 원하는 경우'Map.'에'Boolean.TRUE'를 추가 할 수 있습니다. – OldCurmudgeon

+1

BitSet은 작고 밀집된 숫자 집합에 매우 효율적입니다. 그러나 새로운 BitSet(). add (Integer.MAXVALUE);는 이미 268MB를 할당합니다. 따라서 신중히 사용해야합니다. – Arne

관련 문제