2017-01-10 9 views
0

이 사용 사례에서는 컬렉션에 항목 그룹을 저장해야합니다. x. 이미 중복 된 항목이없는 경우 x에 항목을 삽입하고 싶지 않습니다. 삽입 순서는 신경 쓰지 않습니다. 크기 x은 매우 다양합니다 (< 10 개 항목 또는 최대 10 개 항목까지 도달 할 수 있음).이 경우 어떤 종류의 컬렉션을 사용해야합니까?

Set을 사용하는 데 중복되거나 순서가 없지만 x을 생성하고 (변경하지 않고) 작업을 수행하면 모든 항목을 효율적으로 신속하게 반복해야합니다. Set가 여전히 최선의 선택일까요?

List에 이미 각 삽입 전에 요소가 들어 있는지 (중복을 피하기 위해) 또는 Set의 멤버를 반복하여 검사하는 것이 더 비쌉니까? 모범 사례/효율성 및 비용에 대한 조언은 정말 감사하겠습니다. 감사합니다.

+0

검색 작업 같은 것을 할 수 있습니다. 만약 당신이 요소의 순서에 대해 걱정하지 않고 중복을 원하지 않는다면 당신은'Set'을 위해 가야합니다. 'Set '을 반복하는 것은 문제가되지 않아야하며'Iterator' 또는 향상된 for 루프를 사용하면됩니다. – user2004685

+2

또한'Set'에 투표를하고, ** 입증 된 ** 당신의 어플리케이션에 문제가 없다면 성능에 대해서 생각하지 않습니다. –

답변

1

List에 이미 요소가 포함되어 있는지 확인하는 것이 훨씬 더 비쌉니다. Set 위에

순회는, 조금 List 반복보다 느리지 만 용적이므로, 오직 상수 배하는 List의 요소의 억제를 확인하는 요소마다 선형 시간을 소요하게 반면 전부가 이차 아니다 .

-1

x를 구성한 후 x를 구성하는 집합을 사용하면 공간 복잡성을 희생하여 시간 복잡성을 개선하기 위해 내용을 배열이나 다른 유형으로 간단히 복사 할 수 있습니다.

1

항목이 이미 있는지 빠르게 확인할 수 있어야하는 경우 HashSet이 내부적으로 HashMap을 사용하므로 모든 조회가 O (1)이므로 HashSet이 가장 좋습니다. 이 조회의 목록은 모든 요소를 ​​하나씩 확인하므로 매우 비쌉니다.

그리고 모든 요소를 ​​반복 할 필요가있을 때 List와 Set를 사용하면 아무런 차이가 없습니다.

주목할만한 점은 HashSet은 더 많은 메모리를 사용하지만 수십 만개는 문제가되지 않는다는 점입니다.

그래서 HashSet은 귀하의 경우에있어서 확실한 승자입니다.

1

추가 작업과 제거 작업이 O(1) (해시 코드 배포가 균일하다고 가정)이므로 LinkedHashSet을 사용하는 것이 좋습니다. 요소 추가/제거에 대해서는 HashSet보다 비효율적 일 수 있지만 많은 요소를 추가 한 후에 많은 요소가 제거되면 더 나은 반복 성능을 가져야합니다.

조회를 위해 O(n)을 요구하는 것은 일반적으로이 경우 피해야 할 일입니다.

0

지도에 데이터를 삽입하여 항목이 중복되지 않도록하고지도를 목록으로 변환하는 것이 좋습니다. 자바 (8)을 사용하는 경우

당신은`O`은`List`에서 (N)와`(1)`지도``에서 O 될 것이

List<Object> result = map.entrySet().stream() 
      .map(x -> x.getKey()) 
      .collect(Collectors.toList()); 
관련 문제