4
votes

Comment puis-je supprimer des éléments "nuls" dans un tableau?

Je suis en train de faire un défi de codage qui stipule:

Étant donné une liste de mots, renvoie les mots qui peuvent être tapés en utilisant des lettres de l'alphabet sur une seule ligne du clavier américain comme l'image ci-dessous (qui est une image de un clavier QWERTY).

Exemple:

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


}

Ce que j'ai fait pour résoudre ce problème est d'écrire une boucle for, alors faites si les instructions qui remplacent toutes les lignes (comme QWERTY) par "" et si la longueur de ceci est supérieure à 1, alors vous ne pouvez pas taper ce mot sur une ligne. J'obtiens presque la sortie correcte, mais mon tableau contient des éléments nuls.

Ma sortie est:

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

Comment puis-je retourner un tableau qui n'a pas ces éléments nuls? Pour compléter ce défi, je dois renvoyer un tableau String [] . Je ne peux pas utiliser une ArrayList pour retourner.

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


2 commentaires

voir stackoverflow.com/questions/24112715/… dans la question, remplacez i> 0 par i! = null


Copie possible de Supprimer la valeur Null du tableau de chaînes en Java


6 Réponses :


2
votes

Le problème initial est que vous renvoyiez un Array qui était de la même taille que le Array d'origine. Donc, si l'un des éléments ne correspond pas, un emplacement dans le Array conservera sa valeur par défaut, qui est null . Vous devez garder une trace du nombre d'éléments à copier. Vous pouvez le faire avec un compteur et Arrays.copyOf () .

Juste pour ce que ça vaut, Java 8+, nous pouvons le faire:

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


0 commentaires

3
votes

Vous pouvez utiliser ce qui suit pour supprimer toutes les valeurs nulles d'un tableau de chaînes:

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


0 commentaires

0
votes

Votre tableau de résultats est initialisé avec la taille du tableau de mots. Vous pouvez utiliser ArrayList pour l'attribution dynamique.

Une fois que vous pouvez renvoyer la méthode toArray de ArrayList, vous retournerez le tableau de séparation souhaité.

Si vous n'êtes pas autorisé à utiliser ArrayList dans le code, je chercherais comment dimensionner mon tableau de résultats dynamiquement.


0 commentaires

5
votes

En utilisant cette seule ligne:

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

Filtre le tableau et récupère tous les objets qui ne sont pas Null. N'oubliez pas de transformer le flux en un tableau.


0 commentaires

1
votes

Vous pouvez simplement utiliser une ArrayList au lieu d'un tableau, puis appeler toArray à la fin si vous avez vraiment besoin de renvoyer un tableau 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 commentaires

0
votes

Essayez de stocker les valeurs non nulles dans une variable différente et comptez-les, initialisez un autre tableau avec le nombre et copiez les valeurs dans ce dernier tableau. Démontré comme suit:

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 commentaires