как упорядочить случайные значения по хеш-коду в hashmap - PullRequest
0 голосов
/ 27 января 2012

У меня есть простой класс, который заполняет простую хэш-карту. Я хочу упорядочить значения по хэш-коду, как это сделать?

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

    public class Ch11Ex18 {
        public static void main(String[] args) {
            Random rand = new Random(47);
            Map<Integer,Integer> m = new HashMap<Integer,Integer>();
            for(int i = 0; i < 10000; i++) {
              // Produce a number between 0 and 20:
              int r = rand.nextInt(20);
              Integer freq = m.get(r);
              m.put(r, freq == null ? 1 : freq + 1);

            }
            System.out.println(m);
          }
    }

Ответы [ 4 ]

3 голосов
/ 27 января 2012

Вы не: HashMap изначально неупорядочен.

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

Вы можете создать ArrayList<Integer>, содержащий копиюзначения и отсортировать , что - но тогда у вас не будет ключей.

Вы можете создать ArrayList<Map.Entry<Integer, Integer>>, содержащий копию записей , исортировать это ... но на самом деле, какой в ​​этом смысл?

По сути, это странная вещь - хэш-коды должны не использоваться, как это, в основном.Они не уникальны, их не следует рассматривать как источник случайности и т. Д. Независимо от того, какая здесь более широкая картина, существует более подходящий подход.

2 голосов
/ 27 января 2012

В вашем случае, поскольку Integer.hashCode() равно фактическому числу, вы можете просто подключить свои сопоставления к TreeMap, и они будут отсортированы соответственно.

2 голосов
/ 27 января 2012

TreeMap сортирует по ключу.

Map yourMap= new HashMap();
// Enter values
Map sortedMap = new TreeMap(yourMap);
1 голос
/ 27 января 2012

Порядок итерации HashMap - это естественное упорядочение хеш-кодов ключей (поскольку значение хеш-функции определяет сегмент, а сегменты повторяются последовательно), поэтому вы можете просто выполнить итерацию по map.keySet().Для типа ключа Integer хеш-код равен фактическому значению Integer.

...