[英]How do I remove an element from an array in Java? And how do I skip null array elements?
[英]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.