java 如何删除数组中的“null”元素?

nx7onnlm  于 2023-02-02  发布在  Java
关注(0)|答案(7)|浏览(526)

我目前正在进行一项编码挑战,内容如下:
给定一个单词列表,返回只能在美式键盘的一行上使用字母表字母键入的单词,如下图所示(这是QWERTY键盘的图像)。
示例:

Input: ["Hello", "Alaska", "Dad", "Peace"]
Output: ["Alaska", "Dad"]
    • 我所做的就是**写一个for循环,然后用if语句将所有行替换为""(就像QWERTY),如果这个长度大于1,那么你就不能在一行中输入这个单词。我得到的输出几乎是正确的,但是我的数组包含空元素。

我的输出是:

[null,"Alaska","Dad",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;
    }

}
xxhby3vn

xxhby3vn1#

使用这一个内衬:

Arrays.stream(result).filter(Objects::nonNull).toArray(String[]::new)

筛选数组并获取所有非Null的对象。不要忘记将流转换回数组。

o2gm4chl

o2gm4chl2#

可以使用以下命令从字符串数组中删除所有空值:

List<String> list = new ArrayList<String>(Arrays.asList(myArray));
list.removeAll(Collections.singleton(null));
String[] result = list.toArray(new String[list.size()]);
8tntrjer

8tntrjer3#

原来的问题是你返回的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);
}

它将使用Stream.of创建一个Stream的行,并通过words数组进行筛选,仅保留键盘上单行中仅由字母组成的行

fcy6dtqo

fcy6dtqo4#

如果确实需要返回String数组,可以只使用ArrayList而不是数组,然后在最后调用toArray

public String[] findWords(String[] words) {
        List<String> result = new ArrayList<>();

        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.add(words[i]);
                }
            }
        }

        return result.toArray(new String[0]);
    }
z0qdvdin

z0qdvdin5#

你的结果数组是用单词数组的大小初始化的,你可以用ArrayList动态赋值。
之后可以返回ArrayList的toArray方法,这样就可以返回所需的条纹数组。
如果不允许在代码中使用ArrayList,我将研究如何动态调整结果数组的大小。

jv2fixgn

jv2fixgn6#

尝试将非空值存储在不同的变量中并对它们进行计数,用计数值初始化另一个数组,然后将值复制到后一个数组中。演示如下:

class Solution {
    public static String[] findWords(String[] words) {
    String[] resultWithNull = new String[words.length];
    int counter = 0;

    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) {
         resultWithNull[counter] = words[i];
         ++counter;
       }
     }
   }

   String[] result = new String[counter];
   for (int i = 0 ; i < counter; i++) {
      result[i] = resultWithNull[i];
   }
   return result;
 }

}

eufgjt7s

eufgjt7s7#

减小包含空元素的数组大小的一种方法是使用.filter()方法。此方法将遍历数组的每个元素并检查其是否为空。如果不为空,则将该元素添加到新数组中。然后将返回新数组,该新数组将仅包含非空的元素。

相关问题