簡體   English   中英

如何刪除數組中的“空”元素?

[英]How can I remove "null" elements in an array?

我目前正在進行一項編碼挑戰,其中指出:

給定一個單詞列表,返回可以在美式鍵盤的一行中使用字母表中的字母鍵入的單詞,如下圖所示(這是 QWERTY 鍵盤的圖像)。

例子:

Input: ["Hello", "Alaska", "Dad", "Peace"]
Output: ["Alaska", "Dad"]

我為解決這個問題所做的是編寫一個 for 循環,然后執行將所有行(如 QWERTY)替換為""的語句,如果它的長度大於 1,那么你不能在一行中鍵入該單詞. 我幾乎得到正確的 output,但我的數組包含 null 個元素。

我的 output 是:

[null,"Alaska","Dad",null]

如何返回一個沒有這些 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;
    }


}

使用這個襯墊:

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

過濾數組並獲取所有非null的對象。 不要忘記將流轉換回數組。

您可以使用以下命令從字符串數組中刪除所有空值:

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

最初的問題是您返回的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 Array過濾並僅保留鍵盤上單行中僅由字母組成的行

您可以使用ArrayList而不是數組,如果確實需要返回String數組,則最后調用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]);
    }

您的結果數組使用單詞數組的大小進行初始化。 您可以使用ArrayList進行動態分配。

在您可以返回ArrayList的toArray方法之后,您將返回所需的striing數組。

如果不允許在代碼中使用ArrayList,我會尋找如何動態調整結果數組的大小。

嘗試將非空值存儲在不同的變量中並對其進行計數,使用計數初始化另一個數組並將值復制到后一個數組。 演示如下:

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;
 }

}

減少具有 null 個元素的數組大小的一種方法是使用 .filter() 方法。 該方法將 go 遍歷數組的每個元素,檢查是否不是 null。如果不是 null,則將該元素添加到新數組中。 然后將返回新數組,並將僅包含不是 null 的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM