Простой способ управления многомерным массивом со строковыми и целочисленными ключами - PullRequest
1 голос
/ 06 мая 2020

Я новичок в Java, поэтому в этом мне приходится полагаться на это сообщество.

Мне нужно сохранить объект в каком-то массиве / списке, где я могу быстро получить доступ к объекту, используя строку и два межчисленных ключа. Что-то вроде a["string"][1][1] - я просмотрел несколько различных руководств и учебных пособий, но не смог найти хорошего решения, которым легко управлять.

Я создаю плагин Minecraft, в котором мне нужно отслеживать of where Speci c Блоки с world, chunk_x и chunk_z - я пытаюсь создать метод, в котором я могу указать местоположение, имеющее три вышеупомянутых значения, и выполнить быстрый поиск на основе в мире и чанке, поэтому мне не нужно перебирать все сохраненные блоки в мире, но я могу ограничить его 9 чанками мира. (Текущий кусок, в котором я нахожусь, и все окружающие его соседи)

Ответы [ 3 ]

2 голосов
/ 06 мая 2020

Как насчет этого:

Map<String, Object[][]> store;
1 голос
/ 06 мая 2020

Как насчет комбинации Map и Pair ?

Map<String, Pair<Integer, Integer>> tripletMap = new HashMap<>;

tripletMap.put(Pair.with(23, 1););

Вы можете получить доступ к значениям из вашего триплета как любой карты, а затем получить Pair как:

Pair<Integer, Integer> myPair = tripletMap.get("key")
myPair.getValue0()
myPair.getValue1()

1 голос
/ 06 мая 2020

Это обязательно должен быть многомерный массив? Вы можете использовать только карту ha sh с настраиваемым ключом, который содержит ваш строковый ключ и два целочисленных ключа. Вот полный пример того, что я имею в виду:

import java.util.HashMap;
import java.util.Objects;

public class multidim {
    static class Key {
        int index0, index1;
        String str;
        int _hash_code;

        public Key(String s, int i0, int i1) {
            _hash_code = Objects.hash(s, i0, i1);
            str = s;
            index0 = i0;
            index1 = i1;
        }

        public int hashCode() {
            return _hash_code;
        }

        public boolean equals(Object x) {
            if (this == x) {
                return true;
            } else if (x == null) {
                return false;
            } else if (!(x instanceof Key)) {
                return false;
            }
            Key k = (Key)x;
            return (index0 == k.index0)
                && (index1 == k.index1)
                && Objects.equals(str, k.str);
        }
    }

    public static void main(String[] args) {
        HashMap<Key, Double> m = new HashMap<Key, Double>();
        m.put(new Key("mjao", 3, 4), 119.0);
        m.put(new Key("katt$k1t", 4, 6), 120.0);

        System.out.println("Value that we put before: "
            + m.get(new Key("mjao", 3, 4)));
    }
}

Мы определяем класс Key, который представляет значения, которые вы используете для доступа к элементам, и переопределяем его методы equals и hashCode, чтобы он можно использовать на карте ha sh. Затем мы просто используем его с классом java.util.HashMap. Запуск вышеуказанной программы выведет Value that we put before: 119.0.

Edit : Добавить this == x сравнение в equals (небольшая оптимизация).

...