用字符串和整数键管理多维数组的简单方法。

问题描述 投票:0回答:1

我对Java相当陌生,所以我必须依靠这个社区来解决这个问题。

我需要将一个对象存储在某种数组列表中,在那里我可以使用一个字符串和两个互斥键快速访问该对象。比如说 a["string"][1][1] - 我已经看了一些不同的指南和教程,但一直没有能够拿出一个很好的解决方案,易于管理。

我正在创建一个Minecraft插件,我需要跟踪特定的Blocks是与 world, chunk_xchunk_z- 我试图创建一个方法,在这个方法中,我可以提供一个位置,这个位置有前面提到的三个值,并根据世界和chunk进行快速查找,所以我不必迭代世界中的所有存储块,但可以限制在世界的9个chunks。(当前我所在的chunk和周围所有邻居)

java arrays arraylist multidimensional-array
1个回答
1
投票

它必须是一个多维数组吗?你可以只用一个自定义键的哈希图来存放你的字符串键和两个整数键。这里有一个完整的例子来说明我的意思。

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 代表你用来访问元素的值,我们覆盖它的 equalshashCode 方法,这样它就可以在哈希图中使用。然后我们只需将它与 java.util.HashMap 类。运行上述程序将输出 Value that we put before: 119.0.

编辑: 增加 this == x 比较中 equals (一个小小的优化)。


2
投票

这个怎么样。

Map<String, Object[][]> store;

1
投票

那Map和Map的组合呢?对子?

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()

© www.soinside.com 2019 - 2024. All rights reserved.