Прямой доступ к столбцу внутри ArrayList в Java - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь получить доступ не к одному элементу внутри двухмерного ArrayList, а ко всему столбцу. Поскольку это очень легко сделать, когда вам нужна строка (поскольку 2D Array читается по строкам и столбцам), мне было не так легко сделать то же самое для столбца.

Есть ли у вас какие-либо предложения, относящиеся к этому?

Любая помощь будет очень признательна!

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Нет способа прямого доступа к столбцу в двумерном списке, ориентированном на строки. Однако вы всегда можете извлечь требуемое значение.

Чтобы получить столбец с индексом n, вы можете просто запустить:

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

Это также может быть легко изменено на обычный цикл для каждого.

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

for(List<T> row: twoDList) {
    column.add(row.get(n));
}
0 голосов
/ 05 мая 2018

Я недавно опубликовал нечто подобное здесь .

Здесь я создаю ColumnList объект, который позволяет мне манипулировать одним столбцом 2D-массива. В этом случае я сортирую это.

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 голосов
/ 05 мая 2018

Лучший способ - использовать List в пределах List:

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

Чтобы получить child List от parent List, вам необходимо позвонить, например, 0 для первого child List :

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

Чтобы получить String от ребенка List, вам необходимо позвонить:

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

или непосредственно из List в пределах List:

String moreText = listWithList.get(0).get(0); // get the first String from the first List
...