Java Hashmap, как обрабатывать столкновения клавиш для сетки слов - PullRequest
1 голос
/ 01 ноября 2019

У меня есть сетка слов размером 100 * 100, это означает, что символы повторяются, я хочу поместить свою сетку слов в хэш-карту для более быстрого поиска. Когда ключ (символ) отсутствует в hashmap, я добавляю его в hashmap в качестве ключа, а значение - это строка и столбец (позиция) символа в сетке, но теперь, как я могу справиться, когда есть несколькоперсонажи? Например, «а» уже есть в хэш-карте, но в сетке есть еще одно «а» в другом положении строки и столбца), я хочу добавить его, как я могу добиться этого для лучшей производительности? Мне абсолютно необходимо использовать hashmap

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Приведенная выше ссылка, предоставленная Minh, дает хороший обзор.

Если вы не хотите или не можете использовать внешний apis, вы можете проверить параметр с коллекцией в качестве значения:

//Let's say Pos handle your grid coordinates
class Pos {
    int line, col;
    ...
}
...
// You may define the map as
Map<String, List<Pos>> myGrid = new HashMap<>();
...
// And for a given key and pos - in a loop e.g
String key = ... // e.g "a"
Pos pos = ... // e.g {0, 0}
myGrid.computeIfAbsent(key, k->new ArrayList<>()).add(pos);

Вы также можете использовать Set-HashSet вместо List-ArrayList в зависимости от ваших потребностей.

Приветствия!

0 голосов
/ 01 ноября 2019

Пример программы, основанной на идее Айо:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Pos {
    public int x;
    public int y;

    Pos(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class Test {

    public static void main(String[] args) {
        // 2 x 3 array
        char[][] array = { { 'a', 'a', 'e' }, { 'd', 'e', 'f' } };
        Map<Character, List<Pos>> map = new HashMap<>();

        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                map.computeIfAbsent(array[i][j], c -> new ArrayList<>()).add(new Pos(i, j));
            }
        }

        map.forEach((key, value) -> {
            System.out.println("Key: " + key);
            value.stream().forEach(pos -> System.out.printf("(%d, %d) ", pos.x, pos.y));
            System.out.println();
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...