如何删除数组中的"null"元素?

Sat*_*elt 4 java arrays algorithm array-algorithms

我目前正在做一个编码挑战,声明:

给定一个单词列表,返回可以在美国键盘的一行上使用字母表键入的单词,如下图所示(这是QWERTY键盘的图像).

例:

Input: ["Hello", "Alaska", "Dad", "Peace"]
Output: ["Alaska", "Dad"]
Run Code Online (Sandbox Code Playgroud)

我为解决这个问题所做的是编写一个for循环,然后执行if将所有行(如QWERTY)替换为的语句,""如果它的长度大于1,则不能在一行中键入该单词.我得到几乎正确的输出,但我的数组包含null元素.

我的输出是:

[null,"Alaska","Dad",null]
Run Code Online (Sandbox Code Playgroud)

如何返回没有这些null元素的数组?为了完成这个挑战,我必须返回一个String[]数组.我不能用一个ArrayList回来.

class Solution {
    public String[] findWords(String[] words) {
    String[] result = new String[words.length];

    String row1 = "qwertyuiop";
    String row2 = "asdfghjkl";
    String row3 = "zxcvbnm";

    for (int i = 0 ; i < words.length; i++) {
        if (words[i].toLowerCase().replaceAll("[" + row1 + "]", "").length() == 0 ||
           words[i].toLowerCase().replaceAll("[" + row2 + "]", "").length() == 0 ||
           words[i].toLowerCase().replaceAll("[" + row3 + "]", "").length() == 0) {
            if (words[i] != null) {
                result[i] = words[i];
            }


        }
       }

    return result;
    }


}
Run Code Online (Sandbox Code Playgroud)

P. *_*aan 5

使用这个衬垫:

Arrays.stream(result).filter(Objects::nonNull).toArray(String[]::new)
Run Code Online (Sandbox Code Playgroud)

过滤数组并获取所有非null的对象.不要忘记将流转换回数组.


GBl*_*ett 2

最初的问题是您返回的大小Array与原始大小相同Array。因此,如果任何元素不匹配,则 中的一个槽位Array将保留为默认值,即null。您需要跟踪需要复制的项目数量。您可以使用计数器 和 来完成此操作Arrays.copyOf()

就其价值而言,Java 8+ 我们可以做到:

public static String[] findWords(String[] words) {
    return Stream.of("asdfghjkl", "qwertyuiop", "zxcvbnm")
                 .filter(row -> Arrays.stream(words)
                           .anyMatch(e -> e.replaceAll("[" + row + "]","")                  
                           .isEmpty())
                 ).toArray(String[]::new);
}
Run Code Online (Sandbox Code Playgroud)

这将Stream使用数组创建行Stream.of并对其进行过滤words,并且仅保留仅由键盘上的单行中的字母组成的行