문제

마지막으로 Java에서 다음과 같은 하이브리드 구조를 구현하려고 했습니다.

public class MapOfSet<K, V extends HasKey<K>> implements Set<V>, Map<K, Set<V>>

HasKey는 다음 인터페이스입니다.

public interface HasKey<K> {
    public K getKey();
}

불행하게도 Set 인터페이스의 메소드 서명과 Java의 Map 인터페이스 사이에는 일부 충돌이 있습니다.나는 마침내 Set 인터페이스만 구현하고 이 인터페이스를 구현하지 않고 Map 메서드를 추가하기로 결정했습니다.

더 좋은 해결책이 보이나요?

첫 번째 의견에 대한 응답으로 내 목표는 다음과 같습니다.

집합 구조를 갖고 주어진 키 값에 해당하는 이 집합 값의 하위 집합에 효율적으로 액세스할 수 있습니다.처음에는 맵과 세트를 인스턴스화했지만 성능을 최적화하기 위해 두 구조를 결합하려고 했습니다.

도움이 되었습니까?

해결책

아마도 어떤 작업을 정말로 원하는지에 대한 더 많은 정보를 추가할 수 있을 것입니다.키를 기준으로 요소를 자동으로 그룹화하는 세트를 만들고 싶으신가요?문제는 어떤 작업을 수행하고 싶습니까?세트에 요소가 어떻게 추가되나요?그룹화된 보기에서 요소를 제거하여 요소를 삭제할 수 있습니까?내 제안은 다음과 같은 인터페이스입니다.

public interface GroupedSet<K, V extends HasKey<K>> extends Set<V>{
    Set<V> havingKey(K k);
}

Set as map을 사용하려면 다른 방법을 추가하면 됩니다.

Map<K,Set<V>> asMap();

이는 다중 인터페이스 상속의 사용과 그에 따른 문제를 방지합니다.

다른 팁

무엇을 성취하려고 하시나요? Map 이미 키를 다음과 같이 노출하고 있습니다. Set [keySet()](을 통해http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html#keySet()) 방법.신뢰할 수 있는 반복 순서를 원한다면 다음이 있습니다. LinkedHashMap 그리고 트리맵.

업데이트:값이 한 번만 삽입되었는지 확인하려면 위에서 언급한 클래스 중 하나를 확장하여 다음과 같은 것을 만들 수 있습니다. SingleEntryMap 구현을 재정의합니다. put(K key, V value) 고유성 검사를 수행하고 값이 이미 삽입된 경우 예외를 발생시킵니다.

업데이트:이런 것이 효과가 있을까요?(편집기가 없어서 컴파일이 안 될 수도 있습니다.)

public final class KeyedSets<K, V> implements Map<K,Set<V>> {
    private final Map<K, Set<V>> internalMap = new TreeMap<K, Set<V>>;
    // delegate methods go here
    public Set<V> getSortedSuperset() {
        final Set<V> superset = new TreeSet<V>();
        for (final Map.Entry<K, V> entry : internalMap.entrySet()) {
            superset.addAll(entry.getValue());
        }
        return superset;
    }
}

때로는 Map으로, 때로는 Set로 사용되도록 의도된 것이 Map을 구현해야 한다고 말하고 싶습니다. 왜냐하면 Map은 키나 값의 집합은 물론 키와 값 사이의 매핑으로 볼 수 있기 때문입니다.이것이 바로 Map.containsKey() 및 Map.containsValue() 메서드의 용도입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top