2013-07-22 4 views
0

Существует ли краткий подход к созданию карты DoubleKey в Java. Здесь я нашел несколько ответов, но ни один из них не соответствует моим требованиям.DoubleKey Map Implement Issue

Требование:

Допустим, K1, K2, V

  1. только по данным K1, K2 могут предназначаться уникальное значение. Таким образом, создание следующего не работает.

    Map<K2, K1> m2; 
    Map<K1, V> m1;//here K1 needs have multiple V's. 
    
  2. Если поиск по K1, он должен дать Map<K2,V>, наоборот.

Единственное, что я могу сделать, это создание

Map<K1,Map<K2,V>> 
Map<K2,Map<K1,V>> 

И поддерживать как каждый раз. код кажется утомительным.

Даже если использовать это простое решение, когда оно будет масштабироваться до тройной карты ключей, это будет катастрофой.

ответ

2

Если сторонние библиотеки - это честная игра, это звучит так, какГува будет идеально. Table<R, C, V> представляет собой таблицу с ключом «строка» и ключом «столбец». Вы можете использовать get(row, column), чтобы получить значение, основанное на обоих ключей, или вы можете использовать row(r) или column(c) получить Map для соответствующей строки или столбца, или вы можете использовать rowMap(), чтобы получить Map<R, Map<C, V>> или columnMap() получить Map<C, Map<R, V>>.

Если вы не можете использовать сторонние библиотеки, то вы не сможете найти лучшее решение, чем вложенное решение Map, о котором вы уже упоминали.

+0

вы можете сказать мне больше о тройном ключе карты в гуавах Потому что, наконец, мне нужно это любопытное карту. Кажется, что Guava имеет только 2 измерения (строка, столбец), как указано в вашем ответе. Поправьте меня если я ошибаюсь. –

+0

Нет. Если вам нужно иметь возможность запрашивать произвольные комбинации ключей, вероятно, вы должны использовать всю базу данных; если есть всего несколько комбинаций, которые вам нужно запросить, вы можете уйти с помощью «Таблицы >» - но есть момент, когда вещи просто не масштабируются, как мило. –

+0

, по-видимому, сейчас является единственным подходящим подходом. Благодарю. –

2

Предлагаю вам сделать объект и использовать его в качестве ключа для вашей карты. Ваш объект будет содержать k1 ​​и k2.

public class MyObject{ 
K1, K2; 
public MyObject(K1, K2){ this.K1= K1; this.K2=K2; } 
} 
@Override public int hashCode(){}// implement hashCode... 
@Override public boolean equals()// implement equals 
} 

Map<MyObject, V> map = new HashMap<MyObject, V>(); 
map.put(new MyObject(K1,K2), V); 

Обратите внимание на коде выше только ручка и бумага так что вам нужно будет добавить что-то, чтобы сделать его компиляцию

+0

то как насчет поиска только одним ключом, скажем, k2? –

+0

Что вы хотите, чтобы результат был при поиске по 1 клавише? –

+0

Как указано выше, если поиск по k1, он должен вернуть мне карту