Правильно, вы не можете упаковать два 64-битных примитива в другой примитив размером не более 64 бит. И double
, и long
по умолчанию сопоставляются 64 двоичными числами.
Вопрос в том, можете ли вы наложить ограничения на числа , с которыми вы имеете дело. Если вы знаете, у вас всегда будут четные числа или неровные числа, или у первого компонента будет целочисленный диапазон , или вы имеете дело с множествами из 1000 , здесь можно выиграть несколько битов.
Практически говоря, вы никогда не будете использовать все
2 ^ 64 x 2 ^ 64 комбинаций
пар длинных значений.
С другой стороны, нет ничего сложного в обработке карт на парах значений. Это была целая попытка заставить объектно-ориентированные языки, такие как Java, не только иметь дело с типами данных, такими как struct
в C , но также связывать методы с данными.
Вы можете найти хорошие реализации класса Pair в сети, например, angelikalanger.com . Или вы можете легко кодировать реализацию самостоятельно, особенно, поскольку вам нужна только пара Long
значений.
Также рассмотрите возможность использования Pair<Double, Pair<Long, Long>>
или реализации класса Tuple<M,N,T>
сразу вместо Map, т.е. -значение, следуя схеме реализации Pair<M,N>
.
Наконец, вы можете даже использовать базу данных в памяти , такую как H2 , для хранения ваших Tuple(double, long, long)
записей. Достаточно включить его в свой проект в виде библиотеки Java и правильно настроить.
Кстати, 3-кортеж называется тройной . Поэтому вы могли бы правильно назвать ваш class Triple(double, long, long)
или лучше Triple(Double, Long, Long)
.