Как удалить нулевые значения из 2D-массива? - PullRequest
4 голосов
/ 18 января 2012

У меня проблемы с удалением нулевых значений из 2D-массива.Я все еще новичок в программировании.Я искал решения в Интернете, но я не нашел ничего полезного.

Это и упражнение в университете, поэтому имя массива изменили просто на «массив», то же самое для его объектов.Это то, что у меня есть:

import java.util.ArrayList;

public class Compact
{
    public static void Compact(object[][] array)
    {
        ArrayList<object> list = new ArrayList<object>();

        for(int i=0; i<array.length; i++){
            for(int j=0; j < array[i].length; j++){
                if(array[i][j] != null){
                    list.add(array[i][j]);
                }
            }
        }

        array = list.toArray($not sure what to typ here$);
    }
}

Я основал это на решении, которое я нашел для одномерных массивов, но проблема в том, что список является одномерным, так как мне вернуть структуру двумерного массива?«Новый» массив должен быть меньше, без нулевых значений.

Я думал о создании списка для массива [i] и одного для массива [i] [j], но как мне их объединить?снова в 1 2D массив?

Вся помощь очень ценится!

=======================================

Редактировать: это решение, txx всем:

public void compact(Student[][] registrations)
    {
        for(int i=0; i < registrations.length; i++){
            ArrayList<Student> list = new ArrayList<Student>(); // creates a list to store the elements != null
            for(int j = 0; j < registrations[i].length; j++){
                if(registrations[i][j] != null){
                    list.add(registrations[i][j]); // elements != null will be added to the list.
                }
            }
            registrations[i] = list.toArray(new Student[list.size()]); // all elements from list to an array.
        }
    }

Ответы [ 3 ]

2 голосов
/ 18 января 2012

Соответствующая масштабируемая структура для Object[][] является List<List<Object>>.

Также обратите внимание, что классы в Java всегда начинаются с прописных букв, по соглашению.Таким образом, оно должно быть Object, а не object.

2D-массив на самом деле не является 2D-массивом.Это массив массивов.Таким образом, существует один внешний массив и несколько внутренних массивов.Если вы просто хотите удалить пустые значения из внутренних массивов, вы можете просто использовать один временный список для хранения элементов текущего внутреннего массива во время итерации.

for(int i = 0; i < array.length; i++) {
    Object[] inner = array[i];
    List<Object> list = new ArrayList<Object>(inner.length);
    for(int j = 0; j < inner.length; j++){
        if(inner[j] != null){
            list.add(inner[j]);
        }
    }
    array[i] = list.toArray(new Object[list.size()]);
}

Если внешний массив содержит нулевые внутренние массивы,и вы также хотите удалить их, тогда вы должны использовать List<Object[]>:

List<Object[]> outerList = new ArrayList<Object[]>(array.length);
for(int i = 0; i < array.length; i++) {
    Object[] inner = array[i];
    if (inner != null) {
        List<Object> list = new ArrayList<Object>(inner.length);
        for(int j=0; j < inner.length; j++){
            if(inner[j] != null){
                list.add(inner[j]);
            }
        }
        outerList.add(list.toArray(new Object[list.size()]));
    }
}
array = outerList.toArray(new Object[outerList.size()][]);
1 голос
/ 18 января 2012

Просто настройте свою логику, вместо того, чтобы делать toArray в конце, сделайте его в конце первого массива.Вот код, s1 не имеет нулевых значений в конце

    String[][] s = new String[][] { { "00", null, null },
            { "10", "11", null }, { "20", "21", "22" } };
    String[][] s1 = new String[s.length][];
    int k = 0;

    for (int i = 0; i < s.length; i++) {
        ArrayList<Object> list = new ArrayList<Object>();
        for (int j = 0; j < s[i].length; j++) {
            if (s[i][j] != null) {
                list.add(s[i][j]);
            }
        }
        s1[k++] = list.toArray(new String[list.size()]);
    }
0 голосов
/ 18 января 2012

Для каждой строки в двумерном массиве вы можете хранить ненулевые значения в списке. Таким образом, у вас будет список списка, содержащий ненулевые значения из 2D-массива. Теперь преобразуйте его обратно в 2D-массив.

List<List<Integer> list = new ...  
 for(int i=0; i<array.length; i++){
               List<Integer> templist = new ... 
                for(int j=0; j < array[i].length; j++){
                    if(array[i][j] != null){
                        templist .add(array[i][j]);
                    }
                }
                if(!templist.isEmpty()){
                   list.add(templist);
                }
            }
..
//convert back to 2D array

int[][] arr2d = new int[list.length][];
for(List<Integer>:list){
 ... poulate the array accordingly
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...