Nice programing

빈 / 널 값이있는 HashMap에 데이터를 키로 저장하는 것이 좋은 생각입니까?

nicepro 2020. 11. 23. 20:01
반응형

빈 / 널 값이있는 HashMap에 데이터를 키로 저장하는 것이 좋은 생각입니까?


나는 원래를 작성하고 그것에 ArrayList고유 한 값 (예 : 사용자 이름 Strings)을 저장했습니다. 나중에 ArrayList사용자가 있는지 검색 하기 위해를 사용해야 했습니다. 그것은 O(n)검색을위한 것입니다.

내 기술 책임자는 그것을 a로 변경 HashMap하고 사용자 이름을 배열의 키로 저장하고 값을 비어 있기를 원했습니다 Strings.

따라서 Java에서-

hashmap.put("johndoe","");

나중에 실행하여이 사용자가 존재하는지 확인할 수 있습니다.

hashmap.containsKey("johndoe"); 

이것이 O(1)맞습니까?

내 리드는 이것이 이것을 수행하는 더 효율적인 방법이라고 말했고 나에게 의미가 있었지만 해시 맵의 값으로 null / empty를 넣고 요소를 키로 저장하는 것이 약간 벗어 보였습니다.

제 질문은 이것이 좋은 접근 방식입니까? 효율성 ArrayList#contains은 일반적으로 어레이 검색 보다 우수 합니다. 효과가있다. 내 걱정은 다른 사람이 검색 후 이렇게하는 것을 본 적이 없다는 것입니다. 어딘가에서 분명한 문제가 누락되었을 수 있지만 볼 수 없습니다.


고유 한 값 세트 Set가 있으므로 a 가 적절한 데이터 구조입니다. 인터페이스 HashSet구현 인에 값을 넣을 수 있습니다 Set.

내 리드는 이것이 이것을 수행하는 더 효율적인 방법이라고 말했고 나에게 의미가 있었지만 해시 맵의 값으로 null / empty를 넣고 요소를 키로 저장하는 것이 약간 벗어 보였습니다.

리드의 조언에 결함이 있습니다. Map이것에 대한 올바른 추상화가 아닙니다 Set. A Map는 키-값 쌍에 적합합니다. 하지만 값이없고 키만 있습니다.

사용 예 :

Set<String> users = new HashSet<>(Arrays.asList("Alice", "Bob"));

System.out.println(users.contains("Alice"));
// -> prints true

System.out.println(users.contains("Jack"));
// -> prints false

Map값의 유형이 무엇이어야하므로 a를 사용하는 것은 어색 할 것입니다. 키-값 쌍이 아닌 키만 있으므로이 질문은 사용 사례에서 의미가 없습니다. 를 사용하면 Set물어볼 필요가 없습니다. 사용법은 완벽하게 자연 스럽습니다.

이것은 O (1) 맞습니까?

예, a HashMap또는 a 에서 검색 하는 HashSet것은 O (1) 상각 된 최악의 경우이고, List또는 a에서 검색 하는 것은 O (n) 최악의 경우입니다.


일부 의견은 a HashSetHashMap. 추상화 수준에서는 괜찮습니다 . 당면한 작업의 추상화 수준에서 --- 고유 한 사용자 이름 모음을 저장하려면 집합을 사용하는 것이 자연스러운 선택이며 맵보다 더 자연 스럽습니다.


이것은 기본적으로 HashSet구현되는 방법 이므로 좋은 접근 방식이라고 말할 수 있습니다. HashSet대신 HashMap빈 값으로 사용할 수도 있습니다 .

예 :

HashSet의 구현 add

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

여기서 map배면 인 HashMapPRESENT더미 값이다.

내 걱정은 다른 사람이 검색 후 이렇게하는 것을 본 적이 없다는 것입니다. 어딘가에서 분명한 문제가 누락되었을 수 있지만 볼 수 없습니다.

앞서 언급했듯이 JDK 개발자는 이와 동일한 접근 방식을 사용하고 있습니다.

참고 URL : https://stackoverflow.com/questions/38691454/is-it-a-good-idea-to-store-data-as-keys-in-hashmap-with-empty-null-values

반응형