2010-03-30 7 views
5

Je veux créer un tableau XY d'entiers (ou n'importe quel type), mais je veux utiliser des méthodes comme "ajouter", "supprimer", "contient", "indexOf "similaire à la classe ArrayList.Java: Tableau bidimensionnel avec méthodes/capacités similaires à ArrayList

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

PS: Je ne veux pas créer un ArrayList ArrayList

+1

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

+0

Non. C'est parce que je veux créer des objets qui vont occuper plus d'une cellule, et chacun peut être vertical ou horizontal. Si nous considérons que ArrayList est vertical, j'aurais des problèmes avec les objets horizontalement, car ils utiliseront plusieurs positions de divers ArrayLists à la fois. –

Répondre

3

Non, AFAIK il n'y a aucune classe comme ceci. 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; 
    } 
} 

Note: Le Typeparameter n'est pas utilisé en interne, parce qu'il n'y a pas une telle chose que new T[][]


Permet de modifier Ajouté ADDX Méthode de démonstration
Correction des erreurs de compilation

1

Il n'y a pas de types matrice natifs dans les bibliothèques Java standard. Cela étant dit, il est assez facile d'en créer un. Les méthodes sont triviales à implémenter et vous pouvez le sauvegarder avec un tableau, un List 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 
} 
+0

Qu'est-ce que vous attendez réellement de 'remove '? (Et voulez-vous vérifier vos arguments?) –

+0

@Tom http://java.sun.com/javase/6/docs/api/java/util/List.html#remove(java.lang.Object) – cletus

+1

I signifie 'Matrix.remove'. Premièrement, il supprime uniquement la première concurrence, ce qui signifie que vous dépendez de la mise en œuvre. Deuxièmement, il déplace les entrées restantes vers le haut d'une manière très peu semblable à une matrice, et provoque 'get' à jeter étrangement. –

1

consultez JAMA, il s'agit de Mathworks et NIST.

2

De votre description, je vous suggère d'essayer JAMA.
Vous pouvez également créer votre propre implémentation pour une matrice XY. Cependant, pour ce faire, vous devrez décider exactement ce que vous voulez de la mise en œuvre.
Si votre matrice n'est pas de taille fixe, vous pouvez utiliser quelque chose comme le format 3-tuple pour stocker des matrices. (Cette représentation n'est efficace que si votre matrice est éparse). En interne, vous utiliserez trois ArrayLists; un pour stocker le numéro de ligne, un second pour stocker le numéro de colonne et le troisième pour stocker la valeur réelle.
En conséquence, vous allez écrire la méthode add(int row, int column, int value), qui prend soin de choses comme garder les ArrayLists triés par numéro de ligne, puis par numéro de colonne, etc. pour augmenter l'efficacité des accès aléatoires.
Avec cette représentation, vous pouvez implémenter toutes les méthodes telles que remove(), disponibles pour ArrayList.

Questions connexes