Composit int Ключи со значением - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно хранить пользовательские объекты в виде значения в словаре, например, datastrukturer с двумя составными целочисленными ключами.(составные идентификаторы)

Я пытался использовать массивы в качестве ключей, но оба не работают, потому что я думаю, что это просто указатель на эти массивы, где используются в качестве ключей

Было бы идеально, если быя мог бы использовать это как

store.put([12,43],myObject);
store.get([12,43]);

1 Ответ

1 голос
/ 27 марта 2019

int[] не будет работать, потому что (см. равно Arrays.equals в Java ):

public static void main(String[] args) throws Exception {
    int[] one = new int[] { 1, 2, 3 };
    int[] two = new int[] { 1, 2, 3 };

    System.out.println(one.equals(two)); // <<--- yields false
}

Но, если:

Map<List<Integer>, Object> store = new HashMap<>();

Тогда вы можете:

store.put(Arrays.asList(12, 43), myObject);
myObject == store.get(Arrays.asList(12, 43));

Или, может быть, немного больше ОО - создать тип StoreKey, который просто инкапсулирует List:

public final class StoreKey {
    private List<Integer> keyParts;

    public static StoreKey of(int... is) {
        return new StoreKey(IntStream.of(is)
                                     .boxed()
                                     .collect(Collectors.toList()));
    }

    public StoreKey(List<Integer> keyParts) {
        this.keyParts = keyParts;
    }

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

    @Override
    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof StoreKey)) {
            return false;
        }

        return this.keyParts.equals(((StoreKey) obj).keyParts);
    }

}

И затем:

Map<StoreKey, Object> store = new HashMap<>();
store.put(StoreKey.of(12, 43), myObject);

Наконец, мы видим, что это будет работать как ключ, потому что:

public static void main(String[] args) throws Exception {
    StoreKey one = StoreKey.of(1, 2, 3);
    StoreKey two = StoreKey.of(1, 2, 3);

    System.out.println(one.equals(two)); // <<--- yields true
}
...