Кодировать два длинных в другой примитив в Java - PullRequest
3 голосов
/ 01 августа 2011

У меня есть Tuple объект, который содержит 3 примитива: Tuple(double, long, long). Чтобы избежать создания огромного количества Tuple, я подумываю использовать примитив MAP библиотеки Trove, который будет принимать два примитива в качестве ключа и значения. В моем случае это будет Map<double, some primitive>.

Мой вопрос: возможно ли эффективно кодировать два long в один примитив, который я могу сохранить на карте, и затем декодировать их?

Ответы [ 4 ]

7 голосов
/ 01 августа 2011

возможно ли эффективно закодировать два длинных в один примитив

Нет, просто потому, что long являются 64-битными, и ни один Java-примитив не длиннее этого. Вам понадобится 128-битный примитив для кодирования в него двух длин.

1 голос
/ 01 августа 2011

Правильно, вы не можете упаковать два 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).

1 голос
/ 01 августа 2011

Вы можете использовать карту двойных объектов Trove и закодировать два длинных в BigInteger, но если ваша цель - строго придерживаться примитивных типов, это, очевидно, не поможет.

0 голосов
/ 02 августа 2011

Как говорит Джунас, нет ни одного примитива, который бы содержал 128 бит.Что может удовлетворить вашу потребность, так это использовать массив для хранения двух длин: Map<Double, long[]>.Хотя Double и long[] не являются строго примитивами, которые могут подойти.Помните, что вы не можете поместить double (small-d) в карту, поскольку карты могут содержать только ссылочные типы, а не примитивы.

В качестве альтернативы, как насчет Map(Double, Pair), где Pair - это небольшой классдержать два длинных?В большинстве библиотек что-то подобное лежит где-то рядом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...