2015-12-21 6 views
-1

Есть ли способ параметризовать Apache Commons 'MultiKeyMap с несколькими ключами? т.е.Параметрировать MultiKeyMap с несколькими ключами

MultiKeyMap<String, String, Integer, Float> m = new MultiKeyMap<String, String, Integer, Float>(); 

Я изначально был сырым MultiKeyMaps, но из-за частоты этих карт в моей программе я хочу, чтобы обеспечить согласованность, параметризуя их.

Я не хочу использовать MultiKeys, потому что данные, хранящиеся в MultiKeyMap, требуют MultiKey<String, String, Integer>. Однако MultiKey поддерживает только ключи одного типа (MultiKey<String>илиMultiKey<Integer>). Если есть обходной путь к этому, я открыт для предложений.

Чтобы быть ясным, общая проблема, которую я хочу решить, заключается в следующем: я хочу убедиться, что в моей программе у MultiKeyMaps есть ключи того же типа, параметризируя их, но с разными классами внутри ключа (<K, K, K, V> = <String, String, Integer, Float>).

EDIT: Это было предложено (в настоящее делецией ответ) Я использую Triple<String, String, Integer>, и я попробовал:

private static MultiKeyMap<Triple<String, String, Integer>, Float> multiKeyMap = new MultiKeyMap<Triple<String, String, Integer>, Float>(); 
Triple<String, String, Integer> t = Triple.of("asdf", "asdf", 4); 
multiKeyMap.put(t, 5); 

Однако в третьей строке этого заявления, кажется, ожидать чего-то в виде от put(Triple<String, String, Integer> key1, Triple<String, String, Integer> key2, Float value). Мой вопрос заключается в следующем: с этим ответом мне теперь не нужно MultiKeyMap? Должен ли я использовать Map<Triple<String, String, Integer>, Float> сейчас?

Стоит также отметить, что мне нужно итерацию по этой карте часто (с большим количеством данных), что было легко, когда у меня был непараметризированным MultiKeyMap, потому что я мог бы просто изменить параметры в методе get() как необходимо. Используя Triple, я считаю, что мне нужно было бы создать новый экземпляр Triple на каждой итерации; это будет тяжелый ресурс или есть способ обойти это?

+1

MultiKeyMap позволяет использовать только один тип ключа, поэтому параметры я могу видеть: 1) использовать его без генериков 2) свернуть ваши типы ключей до строки 3) использовать карту с Triple 4) написать свою собственную оболочку вокруг MultiKeyMap , которая позволяет использовать разные типы ключей (т. е. содержать предупреждения типа). Построение тройки (№ 3) не будет иметь большого влияния на производительность и будет самым простым способом продвижения с точки зрения кода. Если у вас есть доступ к готовому тестированию производительности, попробуйте его до и после, посмотрите, что это за последствия. В противном случае вы можете быть преждевременно оптимизированы. – Taylor

+0

@Taylor Итак, если я использую класс «Triple», мне нужно использовать «HashMap» вместо «MultiKeyMap»? – 17slim

+1

Если вы используете Triple для ключа, любая Map impl будет делать (за исключением MultiKeyMap, которая ожидает MultiKey в стандартных методах карты). – Taylor

ответ

1

Вы можете использовать Triple с любым импортом карты (например, HashMap).

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

Предложите выполнить тест производительности до и после применения тройного изменения и посмотреть, приемлемо ли воздействие, и двигаться вперед, если это так.

Смежные вопросы