외부 컬렉션을 사용할 수없는 경우 (주어진 의견을 사용하고 싶지 않으므로) 원하는대로 할 수있는 간단한 수업을 작성할 수 있습니다 (예 : 본질적으로 첫 번째 생각입니다). 라인의 (나는 이것을 컴파일하지 않았고 그것은 처음 생각 이었으므로 나쁜 아이디어 일 수있다.) :
EDIT : 중복 된 값을 허용하는 버전과 하나의 중복 된 버전이있다. 그렇지 않습니다. 값을 덮어 쓰지 않으면 키가 제거되지 않습니다.
이 버전은 중복 값을 허용하지 않습니다
는
class Foo<K, V>
{
private final Map<K, V> keyValue;
private final Map<V, K> valueKey;
{
keyValue = new HashMap<K, V>();
valueKey = new HashMap<V, K>();
}
// this makes sure that if you do not have duplicate values.
public void put(final K key, final V value)
{
if(keyValue.containsValue(value))
{
keyValue.remove(valueKey.get(value));
}
keyValue.put(key, value);
valueKey.put(value, key);
}
public V getValueForKey(final K key)
{
return (keyValue.get(key));
}
public K getKeyForValue(final V value)
{
return (valueKey.get(value));
}
public static void main(final String[] argv)
{
Foo<String, String> foo;
foo = new Foo<String, String>();
foo.put("a", "Hello");
foo.put("b", "World");
foo.put("c", "Hello");
System.out.println(foo.getValueForKey("a"));
System.out.println(foo.getValueForKey("b"));
System.out.println(foo.getValueForKey("c"));
System.out.println(foo.getKeyForValue("Hello"));
System.out.println(foo.getKeyForValue("World"));
}
}
이 버전은 중복 값을 허용하고 다시 주어진 값이 모든 키의 목록을 제공합니다
class Foo<K, V>
{
private final Map<K, V> keyValue;
private final Map<V, List<K>> valueKeys;
{
keyValue = new HashMap<K, V>();
valueKeys = new HashMap<V, List<K>>();
}
public void put(final K key, final V value)
{
List<K> values;
keyValue.put(key, value);
values = valueKeys.get(value);
if(values == null)
{
values = new ArrayList<K>();
valueKeys.put(value, values);
}
values.add(key);
}
public V getValueForKey(final K key)
{
return (keyValue.get(key));
}
public List<K> getKeyForValue(final V value)
{
return (valueKeys.get(value));
}
public static void main(final String[] argv)
{
Foo<String, String> foo;
foo = new Foo<String, String>();
foo.put("a", "Hello");
foo.put("b", "World");
foo.put("c", "Hello");
System.out.println(foo.getValueForKey("a"));
System.out.println(foo.getValueForKey("b"));
System.out.println(foo.getValueForKey("c"));
System.out.println(foo.getKeyForValue("Hello"));
System.out.println(foo.getKeyForValue("World"));
}
}
숨기기를 클래스의 두 맵은 좋은 아이디어입니다. 나중에 더 좋은 방법을 찾으려면 클래스의 내부를 바꾸는 것 뿐이고 나머지 코드는 그대로 둡니다.
해시 테이블이 상당히 정적 인 경우에만 유용합니다. 테이블에 대한 업데이트가 많은 경우이 메소드는 두 개의 HashTable을 업데이트해야합니다. –
일반적으로 (종종?) ID는 객체 자체의 일부이므로 후자는'object.getId()'가됩니다. 또는 귀하의 경우에 적절하지 않습니까? – doublep
그들은 매우 자주 업데이트됩니다! 두 테이블이 나에게 더러운 해결책처럼 보입니다 ...하지만 .. 음 .. – user318247