Как сделать универсальные массивы типа 2d в Java - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать хеш-функцию, используя метод Cuckoo Hash.Проблема возникает, когда я хочу сохранить свою таблицу в 2d массиве, каждый столбец представляет один тип хэш-функции и ее индекс.Когда я попытался сделать его более общим, я также столкнулся с проблемой того, чтобы сделать саму таблицу общим типом.Однако я не могу найти ничего, что позволило бы мне это сделать.

Я пытался использовать метод, упомянутый здесь: Как создать универсальный массив в Java? , но из-за недостатка знаний я не могу заставить его работать, создавновый класс.Я также пытался использовать массивы объектов, и это работает до тех пор, пока мне не понадобятся данные из него, и он просто отказывается разрешить мне приводить их к Node, если я не заключу их в функцию.Этот путь стал беспорядочным и полным потенциальных ошибок

class CuckooHash<Key, Node> {
    class Node{ // Node of a hash to store  key and value
        Key key ;
        Value value ;
    }
    int capacity ;
    Node[][] table = (Node[][]) Array.instanceOf(new Class<Node[]>, capacity ) ; // I tried to mimic C  dynamic array base on what I was able to grapsh
    table = (Node []) Array.instanceOf(new Class<Node>, capacity) ;

По сути, я хочу, чтобы таблица была двумерным массивом общего типа и делала это всесторонним, максимально чистым способом.Кстати, я знаю, что ArrayList доступен, но для моих целей это то, что я застрял с

1 Ответ

0 голосов
/ 07 февраля 2019

Не используйте повторно имена;теперь ваш общий параметр называется Node, а также внутренний класс.Во-вторых, придерживайтесь Java-идиом: общие параметры должны быть одной заглавной буквой.попробуйте 'N'.

Вы не можете создавать массивы параметров.Как правило, вы просто используете 'Object' (это то, что делает ArrayList).

Уловка, с которой вы связаны, заключается в том, что вызывающая сторона передает ссылку на класс, представляющую тип Node, но вы не добавили это какпараметр, и, как правило, вы не хотите этого делать.Например, это означает, что попытка взять List<String> как узел невозможна.

Я на 99% уверен, что вы просто хотите Object [] [] здесь.Приводите к (T) везде, где это необходимо, и не предоставляйте доступ к этому полю через (общедоступный) метод доступа, и у вас все еще есть тип безопасности.

...