Estoy tratando de acceder no a un solo elemento dentro de una ArrayList 2D sino a una columna completa. Dado que es muy fácil hacerlo cuando necesita una fila (dado que la matriz 2D se lee por fila y columnas), no fue tan trivial para mí hacer lo mismo para una columna.

¿Tienes alguna sugerencia relevante para eso?

¡Cualquier tipo de ayuda será muy apreciada!

¡Muchas gracias!

1
user1505320 5 may. 2018 a las 18:20

3 respuestas

La mejor respuesta

No hay forma de acceder directamente a una columna en una lista orientada a filas en 2-D. Sin embargo, siempre puede extraer el valor requerido.

Para recuperar, la columna en el índice n, simplemente puede ejecutar:

twoDList.stream().map(innerList -> innerList.get(n))
                 .collect(Collectors.toList());

Esto también se puede cambiar fácilmente a un ciclo normal para cada ciclo.

List<T> column = new ArrayList<T>();

for(List<T> row: twoDList) {
    column.add(row.get(n));
}
0
ernest_k 5 may. 2018 a las 15:44

Recientemente publiqué algo similar aquí.

Aquí creo un objeto ColumnList que me permite manipular una sola columna de una matriz 2D. En este caso lo estoy ordenando.

class ColumnList<T> extends AbstractList<T> implements List<T> {
    private final T[][] array;
    private final int column;

    public ColumnList(T[][] array, int column) {
        this.array = array;
        this.column = column;
    }

    @Override
    public T get(int index) {
        return array[index][column];
    }

    @Override
    public T set(int index, T element) {
        return array[index][column] = element;
    }

    @Override
    public int size() {
        return array.length;
    }
}

public void test(String[] args) {
    Integer[][] array = {
            {6, 8, 9, 16},
            {0, 6, -3, 4},
            {18, 2, 1, 11}
    };
    System.out.println("Before: " + Arrays.deepToString(array));
    // Sort each column separately.
    for (int i = 0; i < array[0].length; i++) {
        List<Integer> column = new ColumnList<>(array, i);
        Collections.sort(column);
    }
    System.out.println("After:  " + Arrays.deepToString(array));
}
0
OldCurmudgeon 5 may. 2018 a las 16:03

La mejor manera es usar un List dentro de un List:

List<List<String>> listWithList = new ArrayList<List<String>>();

Para obtener el hijo List del padre List debe llamar, por ejemplo, 0 para el primer hijo List:

List<String> anotherList = new ArrayList<String>();
anotherList = listWithList.get(0); // get the first complete List

Para obtener un String del hijo List debe llamar:

String someText = anotherList.get(0); // get the first String

O directamente desde List dentro de List:

String moreText = listWithList.get(0).get(0); // get the first String from the first List
0
tima 5 may. 2018 a las 16:31