Удаление пустой строки и уменьшение той же строки [] [] Массив - PullRequest
0 голосов
/ 13 ноября 2018

У меня очень простой вопрос, но, видимо, я не могу найти решение.Я инициализировал массив строк размером 100 строк и 100 столбцов.

String[][] array1 = new String[100][100];

Однако большинство элементов пусты.Я хочу удалить эти пустые строки, но не используя другой массив.Скажем, непустые строки - от строки 1 до 16 и от столбца 1 до 10. Таким образом, конечный размер вывода должен быть

String[][] array1 = new String [16][10];

. Как найти и удалить строки из первого массива и уменьшитьразмер массива одновременно?

Ответы [ 5 ]

0 голосов
/ 13 ноября 2018

Вот изящный способ сделать это с помощью Streams

array = (String[][]) Arrays.asList(array).stream()
                            // Filters out empty arrays
                            .filter(checkEmptyArrays())
                            // Filters out empty strings
                            .map(x -> cleanUpEmptyStrings(x))
                            // Collects it all back into the array matrix
                            .collect(Collectors.toList()).toArray(new String[0][0]);


private String[] cleanUpEmptyStrings(String[] x) {
    return Arrays.asList(x).stream().filter(y -> y != null && !y.equals("")).collect(Collectors.toList()).toArray(new String[0]);
}

private Predicate<String[]> checkEmptyArrays() {
    return k -> Arrays.stream(k).filter(l -> l != null && !l.equals("")).count() != 0;
}

Вот тест

@Test
public void test() {
    String[][] array = new String[100][100];
    for (int i=0;i< 10; i++) {
        for (int j=10; j< 16; j++) {
            array[i][j] = "abcd";
        }
    }

    array = (String[][]) Arrays.asList(array).stream()
                            // Filters out empty arrays
                            .filter(checkEmptyArrays())
                            // Filters out empty strings
                            .map(x -> cleanUpEmptyStrings(x))
                            // Collects it all back into the array matrix
                            .collect(Collectors.toList()).toArray(new String[0][0]);

    for (String[] a: array) {
        System.out.println(a.length);
    }

}
0 голосов
/ 13 ноября 2018

Как и в других ответах и ​​комментариях, вы не можете изменить размер массива, вам придется создать новый.
Однако лучше использовать Collection , которыйавтоматически изменит свой размер.

Если вы все еще хотите сделать это с помощью нового массива, вот как вы можете это сделать: -
Я взял массив размером 3x3, вы можете использовать код для100x100

{"row0 col0", "", "row0 col2"},
{"row1 col0", "", ""},
{"", "", ""}

В этом примере, поскольку максимальное количество столбцов, используемых любой строкой, равно 2, мы можем иметь новый массив с двумя столбцами вместо 3.

Аналогично, последнийстрока практически пуста без непустых строк, у нас может быть новый массив с двумя строками вместо 3.

public static void main(String[] args) {
    String[][] array1 = new String[][]{
            {"row0 col0", "", "row0 col2"},
            {"row1 col0", "", ""},
            {"", "", ""}
    };

    long maxNoOfColumnsInAnyRow = Arrays.stream(array1)
            .map(strings -> Arrays.stream(strings)
                    .filter(s -> s != null && !s.isEmpty())
                    .count())
            .max(Long::compareTo)
            .orElse((long) array1[0].length);

    long noOfNonEmptyRows = Arrays.stream(array1)
            .filter(strings -> Arrays.stream(strings)
                    .anyMatch(s -> s != null && !s.isEmpty()))
            .count();

    String[][] array2 = new String[(int) noOfNonEmptyRows][(int) maxNoOfColumnsInAnyRow];

    int i = 0, j;
    for (String[] strings : array1) {
        j = 0;
        for (String str : strings) {
            if (str != null && !str.isEmpty()) {
                array2[i][j] = str;
                j++;
            }
        }
        if (j != 0) i++;
    }

    System.out.println(Arrays.deepToString(array2));
}

Вывод [[row0 col0, row0 col2], [row1 col0, null]], который является массивом 2x2.

0 голосов
/ 13 ноября 2018

Вы не можете уменьшить размер массива. Однако вы можете создать метод, который возвращает усеченную версию старого массива, например

static String[][] trimArr( String[][] oldArr, int rows, int cols)
{
    String[][] trimmedArr = new String[rows][cols];
    for (int i = 0; i < trimmedArr.length; i++)
         for (int j = 0; j < trimmedArr[i].length; j++)
             trimmedArr[i][j] = oldArr[i][j];            
    return trimmedArr;
}
0 голосов
/ 13 ноября 2018

Массив имеет фиксированную длину.Вы должны заменить его другим массивом, который соответствует вашему требованию

0 голосов
/ 13 ноября 2018

Размер массивов не может быть изменен. Однако вы можете сделать это, переназначив переменную:

int x, y = size that you have determined the final array should be
String[][] temp = new String[x][y]
//Copy the values that are not empty into temp
array1 = temp

Это заменит массив1 версией правильного размера, без необходимости вводить другую постоянную переменную (x, y и temp могут быть проигнорированы после этого)

...