如何从2D数组中删除空值?

时间:2012-01-18 09:37:07

标签: java arrays null 2d

我在从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$);
    }
}

我基于我找到的1D阵列的解决方案,但问题是列表是1D,那么如何获得2D阵列的结构? “new”数组必须更小,没有空值。

我想为array [i]创建一个列表,为array [i] [j]创建一个列表,但是如何将它们再次合并为1个2D数组呢?

非常感谢所有帮助!

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

编辑:这是解决方案,tnx everyone:

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 个答案:

答案 0 :(得分:2)

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 :(得分:1)

只需调整你的逻辑,而不是在最后使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()]);
    }

答案 2 :(得分:0)

对于2D数组中的每一行,您可以将非空值存储在列表中。因此,您将拥有一个包含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
}