6
votes

Java: matrice bidimensionnelle avec méthodes / capacités similaires à ArrayList

Je veux créer un tableau XY d'entiers (ou n'importe quel type), mais je souhaite utiliser des méthodes telles que "Ajouter", "Supprimer", "Contient", "Indexof" similaire à la classe ArrayList.

Y a-t-il une classe existante avec ces capacités?

PS: Je ne veux pas créer de arrayliste de ArrayList


2 commentaires

"Je ne veux pas créer de arrayliste de ArrayList" Pourquoi? Cela correspondrait parfaitement à votre description. Est-ce parce que vous voulez utiliser des types primitifs?


Non. C'est parce que je souhaite créer des objets qui occuperont plus d'une cellule et chacun peut être verticalement ou horizontalement. Si nous considérons que le tableau est vertical, j'aurais des problèmes avec des objets horizontalement, car ils utiliseront à la fois divers postes de variaos arraylistes à la fois.


4 Réponses :


1
votes

Il n'y a aucun type de matrice natif dans les bibliothèques java standard. Cela étant dit, il est assez facile de créer un. Les méthodes sont triviales à mettre en œuvre et vous pouvez la récupérer avec une matrice, une liste code> ou autre.

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
}


3 commentaires

Qu'est-ce que vous attendez supprimer pour faire réellement? (Et voulez-vous vérifier vos arguments?)


@Tom Java .sun.com / javase / 6 / Docs / API / Java / Util / ...


Je veux dire matrix.remove . Premièrement, il ne supprime que la première concurrence, ce qui signifie que vous dépendez de la mise en page de la mise en œuvre. Deuxièmement, il déplace les entrées restantes de manière la plus moatrice, et provoque des causes à jeter étrangement.



3
votes

Non, Afaik Il n'y a aucune classe comme celle-ci. Mais la mise en œuvre d'un devrait être assez facile:

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;
  }
}


0 commentaires

1
votes

Consultez JAMA , c'est à partir des mathworks et du NIST.


0 commentaires

2
votes

De votre description, je vous suggère d'essayer d'utiliser Jama.
Vous pouvez également créer votre propre implémentation pour une matrice XY. Cependant, pour ce faire, vous devrez décider de ce que vous voulez exactement de la mise en œuvre.
Si votre matrice n'est pas de taille fixe, vous pouvez utiliser quelque chose comme le format 3-T -PLE pour stocker des matrices. (Cette représentation n'est efficace que si votre matrice est clairsemée). En interne, vous utiliserez trois arraylistes; Un pour stocker le numéro de ligne, deuxième pour stocker le numéro de colonne et le troisième pour stocker la valeur réelle.
En conséquence, vous écrirez le Ajouter (int ligne, la colonne INT, la valeur INT) Méthode, qui prend soin des éléments tels que garder les arraylistes triés par numéro de ligne, puis par numéro de colonne, etc. pour augmenter la Efficacité des accès aléatoires.
Avec cette représentation, vous pouvez implémenter toutes les méthodes telles que Supprimer () , contient () , qui sont disponibles pour ArrayList.


0 commentaires