Использование функции hashCode () HashMap's / HashSet для сортировки данных - PullRequest
0 голосов
/ 04 ноября 2018

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

Скажем, например, вход представляет собой гигантский список строк, и цель состоит в том, чтобы распечатать каждую строку, которая имеет длину X. Если я сохраню все строки в HashSet с помощью HashCode ...

  @Override
   public int hashCode() {
       return s.length();
   }

Тогда я бы все проиндексировал по длине. Тогда в теории, если бы я хотел, чтобы все строки длиной 3, я получил список строк с индексом 3.

Как бы я получить список по индексу? Это даже было бы хорошей идеей?

1 Ответ

0 голосов
/ 04 ноября 2018

Это не цель, на которую нацелена hashcode(). Кроме того, в HashMaps объекты НЕ сортируются. Внутренне да, потому что они хранятся в массивах (напоминанием хеш-кода), но класс не предоставляет вам никакого доступа по индексам к его элементам.

Но вы можете расширить Map<Integer, List<String>>, где вы можете отобразить длину n на список строк длины n и реализовать этот дополнительный метод:

public void add(String s) {
    // null check here 
    List<String> list = get(s.length);
    if (list == null) {
        list = new ArrayList<>();
        put (s.lenght, list);
    }
    list.add(s);
}

затем используйте это так:

map.add("hello");
map.add("world");
map.add("knife");
map.add("good");
map.add("day");
map.get(5); // return list of hello, world, knife
...