Как хранить таблицу или матрицу в Java? - PullRequest
5 голосов
/ 23 января 2012

Раньше я использовал матрицу в октаве для хранения данных из набора данных, в Java, как я могу это сделать? Предположим, у меня есть 10-20 столбцов и большие данные, я не думаю,

int [][]data; 

будет лучшим вариантом. Является ли вложенная карта единственным решением?

Ответы [ 7 ]

5 голосов
/ 23 января 2012

Вы можете создать класс Coordinate, который принимает значения X и Y и правильно реализует hashCode и равен.

Затем создайте HashMapи работать с ним.

4 голосов
/ 23 января 2012

Зависит от того, что вам нужно сделать.Если вы знаете размер списков, то массив определенно идеален, поскольку это означает, что у вас будет мгновенный доступ (время чтения / записи) к любой позиции в массиве, это очень полезно для скорости.

Картылучше, если вы не знаете размер, и он должен быть в состоянии адаптироваться.

И, наконец, как я обнаружил в предыдущем вопросе , если у вас есть TON данных, и большая их часть будет равна "0", вы можете также рассмотреть возможность использования разреженный Martrix

2 голосов
/ 23 января 2012

Этот ответ объединяет некоторые из гномед ответ и SJuan76 * ответ содержание.

  1. На быстрый взгляд, я бы предложил вам использовать двумерные массивы , такие как int[][].
    Это не очень большой объем данных (мы говорим о ≈500 дюймов), так что это неплохая идея.

    Преимущества: Это проще, идеально (из структурирование данных сторона) путь,
    особенно , если каждый «слот» матрицы содержит данные.

    Неудобное: Вы должны знать размер матрицы , прежде чем построите ее.
    В любом случае, вы можете изменить ее размер позже, используя Arrays утилиты.

  2. Если выДля более эффективной обработки данных вы можете использовать одноточечную карту .
    То есть ключом каждой записи является java.awt.Point, который определяет , где - этозначение найдено.

    Advantвозраст: Это более эффективно, чем иметь двумерный массив,
    , особенно , если часть вашей матрицы не содержит данных.
    И это адаптивно ;вам не нужно знать какие-либо размеры для его построения / изменения размера.

    Неудобно: Если каждый «слот» вашей матрицы содержит данные,
    вы потеряете (aмного) места и производительности.2D-массив более эффективен, чем.

  3. Хотите узнать больше?Если ваши данные действительно огромны , вы можете использовать разреженную матрицу .
    См. этот вопрос для получения более подробной информации.

0 голосов
/ 23 января 2012
  • Что ж, если ваши индексы представляют собой маленькие целые числа, вы, безусловно, можете использовать вложенные массивы.
  • В матричном классе вы можете использовать простой массив, например, так: (при условии, что n - это число столбцов)
double get(int i, int j) { return data[i*n + j]; }
  • Для общеготаблицу (разреженная матрица), вы можете использовать вложенные карты, но рассмотрите возможность использования com.google.common.collect.Table реализаций из библиотеки Google Guava .
0 голосов
/ 23 января 2012

Я думаю, что многомерные массивы - лучший выбор! Они должны служить вашей цели. Если ваш набор данных состоит только из целых чисел, int [] [] - идеальный выбор.

0 голосов
/ 23 января 2012

Вы можете использовать многомерные массивы или пробовать любые пары, такие как HashMap

0 голосов
/ 23 января 2012

Я бы пока не отказывался от многомерных массивов: вы их пробовали? Вы находите конкретные ограничения? ИМХО, пока ваши данные помещаются в память, массивы могут быть хорошими.

Если ваши данные очень скудны, вы, возможно, захотите взглянуть на карты действительно.

Смежный вопрос между прочим: Создание очень большого массива Java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...