Как я могу удалить "нулевые" элементы в массиве? - PullRequest
0 голосов
/ 08 января 2019

В настоящее время я выполняю задачу кодирования, которая гласит:

Учитывая список слов, верните слова, которые можно набирать, используя буквы алфавита, только на одной строке американской клавиатуры, как на рисунке ниже (это изображение QWERTY-клавиатуры).

Пример:

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

Что я сделал, чтобы решить эту проблему, так это , чтобы написать цикл for, а затем выполнить операторы, которые заменяют все строки (например, 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;
    }


}

Ответы [ 6 ]

0 голосов
/ 09 января 2019

Попробуйте сохранить ненулевые значения в другой переменной и сосчитать их, инициализировать другой массив со счетчиком и скопировать значения в последний массив. Демонстрируется следующим образом:

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

}

0 голосов
/ 09 января 2019

Вы можете просто использовать ArrayList вместо массива и затем вызывать toArray в конце, если вам действительно нужно вернуть массив String.

    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]);
    }
0 голосов
/ 09 января 2019

Используя этот один вкладыш:

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

Фильтрует массив и получает все объекты, которые не равны Null. Не забудьте преобразовать поток обратно в массив.

0 голосов
/ 09 января 2019

Ваш массив результатов инициализируется с размером массива слов. Вы можете использовать ArrayList для динамического присваивания.

После того, как вы можете вернуть метод ArrayList toArray, чтобы вы вернули желаемый массив строк.

Если вам не разрешено использовать ArrayList в коде, я бы искал, как динамически изменять размер моего массива результатов.

0 голосов
/ 09 января 2019

Вы можете использовать следующее для удаления всех нулей из массива строк:

List<String> list = new ArrayList<String>(Arrays.asList(myArray));
list.removeAll(Collections.singleton(null));
String[] result = list.toArray(new String[list.size()]);
0 голосов
/ 09 января 2019

Исходная проблема заключается в том, что вы возвращали 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 строк с использованием Stream.of и отфильтрует массив words и сохранит только те, которые состоят только из букв, в одной строке на клавиатуре

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...