Джава:Двумерный массив с методами/возможностями, аналогичными ArrayList

StackOverflow https://stackoverflow.com/questions/2542250

Вопрос

Я хочу создать массив целых чисел XY (или любого другого типа), но я хочу использовать такие методы, как «добавить», «удалить», «содержит», «indexOf», аналогичные классу ArrayList.

Существует ли какой-либо существующий класс с такими возможностями?

ПС:Я не хочу создавать ArrayList из ArrayList

Это было полезно?

Решение

Нет, AFAIK, такого класса не существует.Но реализовать его должно быть довольно легко:

class BiDimensionalArray<T>{
  Object[][] backupArray;
  int lengthX;
  int lengthY;

  public BiDimensionalArray(int lengthX, int lengthY) {
    backupArray = new Object[lengthX][lengthY];
    this.lengthX = lengthX;
    this.lengthY = lengthY;
  }

  public void set(int x, int y, T value){
    backupArray[x][y] = value;
  }

  public T get(int x, int y){
    return (T) backupArray[x][y];
  }

  public void addX(T[] valuesY) {
    Object[][] newArray = new Object[lengthX+1][lengthY];
    System.arraycopy(backupArray, 0, newArray, 0, lengthX);
    newArray[lengthX]=valuesY;
    backupArray = newArray;
    lengthX = lengthX+1;
  }
}

Примечание:Параметр Type не используется внутри, поскольку не существует такой вещи, как new T[][]

РЕДАКТИРОВАНИЕ
Добавлен метод addX для демонстрации.
Исправлены ошибки компиляции

Другие советы

Судя по вашему описанию, я бы посоветовал вам попробовать использовать JAMA.
Вы также можете создать свою собственную реализацию матрицы XY.Однако для этого вам придется определиться, чего именно вы хотите от реализации.
Если ваша матрица не имеет фиксированного размера, вы можете использовать что-то вроде формата трех кортежей для хранения матриц.(Это представление эффективно только в том случае, если ваша матрица разрежена).Внутри вы будете использовать три списка ArrayList;один для хранения номера строки, второй для хранения номера столбца и третий для хранения фактического значения.
Соответственно, вы напишете add(int row, int column, int value) метод, который заботится о таких вещах, как сортировка ArrayLists по номеру строки, затем по номеру столбца и т. д.для повышения эффективности произвольного доступа.
С помощью этого представления вы можете реализовать все методы, такие как remove(), contains(), доступные для ArrayList.

В стандартных библиотеках Java нет собственных типов матриц.При этом создать его довольно легко.Эти методы тривиальны в реализации, и вы можете поддержать их массивом, List или что-то еще.

public class Matrix<T> {
  private final List<T> values;
  private final int rows;

  public Matrix(int x, int y) {
    this.rows = x;
    values = new ArrayList<T>(x * y);
  ]

  public int get(int x, int y) {
    return values.get(x * rows + y);
  }

  public boolean contains(T t) {
    return values.contains(t);
  }

  // etc
}

проверить ДЖАМА, это из Mathworks и NIST.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top