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

4

我在尝试从一个二维数组中删除空值时遇到了一些问题。我是编程的初学者。我在网上寻找解决方案,但没有找到有用的信息。

这是大学里的一个练习,所以我将数组的名称更改为“array”,对象也是如此。这就是我的代码:

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数组的结构呢?“新”数组必须更小,没有空值。
我考虑为array [i]和array [i] [j]分别创建一个列表,但是如何将它们合并成1个2D数组?
非常感谢所有帮助!
========================================
编辑:这是解决方案,谢谢大家:
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

Object[][] 对应的可调整大小的结构是 List<List<Object>>

另外,需要注意的是,在 Java 中类名总是以大写字母开头,按照惯例应该是 Object 而不是 object

2D 数组实际上并不是一个二维数组,而是一个数组的数组。因此有一个外部数组和多个内部数组。如果您只想从内部数组中删除 null 值,您可以在迭代过程中使用一个临时列表来保存当前内部数组的元素。

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
谢谢!我将尝试在练习中实现这个。有些事情还是有点难以理解,但我现在能够正确完成它了! - Aaron
1
我不得不使用 list.toArray 而不是 Arrays.asList。但它仍然不能像第一篇帖子中所解释的那样工作。 - Aaron
哦,抱歉,我会修正答案的。 - JB Nizet
你的错误是由于内部循环中使用了j,但却增加了i:for(int j = 0; j < innerArray.length; i++)。因此你有一个无限循环,不断创建新的数组。 - JB Nizet

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()]);
    }

0
在二维数组中,您可以使用 For Each Row 循环将非空值存储到列表中。因此,您将拥有一个包含来自二维数组的非空值的列表列表。 现在将其转换回二维数组。
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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接