0
votes

Jetons de string Java Hacker Rank Java

Je travaille sur le java String Jetkens em > sur Hackerrank. Mon code est comme suit:

import java.io.*;
import java.util.*;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.nextLine();
        // Write your code here.
        scan.close();
        // if length is 0
        if (s.length() == 0 || s == null) {
            System.out.println(0);
            return;
        }

        // It seems we need to remove some spaces
        s = s.trim();


        String[] words = s.split("[ |!|,|\\?|\\.|_|'|@|]+");
        System.out.println(words.length);

        for (String word: words){
            System.out.println(word);
        }

        
    }
}



5 commentaires

Qu'est-ce que vous essayez de faire? Diviser une chaîne par des caractères non mot? Si oui c'est juste (\ w +)


1) nextline () ne peut pas retourner null , donc s ne peut pas être null , rendant le s = = null superflu. --- 2) s.length () == 0 est mieux écrit comme S.Impty () . --- 3) Vous devriez déplacer s = s.trim () avant la vérification de la chaîne vide, une ligne de rien que des espaces sont traités correctement.


avec si (S.Length () == 0 || s == null) { Vérifiez le null d'abord


@Scarywombat Pas besoin, voir mon commentaire précédent, mais une observation généralement valide.


Pour toute personne désirant voir la description complète du défi: Java String Jetkens | Hackerrank


3 Réponses :


1
votes

regex "[|! |, | \\? | \\. | _ | _ | '| @ |] +" est étranger.

  • Ne séparez pas les caractères dans un [] Classe de caractères par le | ou modèle , puisque ce motif ne s'applique qu'en dehors d'une classe de caractères.

  • Il n'est pas nécessaire d'échapper au ? et . dans une classe de caractères, car ils ne sont pas des caractères spéciaux là-bas.

    corrigé regex serait [!,? ._ '@] + ou [^ a-za-z] + . .

    Le principal problème avec le code dans la question est que divisé () peut renvoyer un tableau dans lequel le premier élément est une chaîne vide.

    Exemple 1: entrée "", x " retournera [" "," x "] . La chaîne vide avant le principal , est incluse et la chaîne vide après le suivi , est exclue, car le Javadoc dit SO : < EM> "Les chaînes vides de traînant ne sont donc pas incluses dans la matrice résultante" .

    Exemple 2: Entrée "" retournera [""] , car le Javadoc dit explicitement que < / Fort>: "Si l'expression ne correspond à aucune partie de l'entrée, la matrice résultante n'a qu'un seul élément, à savoir cette chaîne" . Notez comment la règle "String Trailing vide" n'est pas appliquée à ce cas d'utilisation spécifique.

    Exemple 3: Entrée ",", " retournera [] , car les chaînes vides suivantes sont exclues.

    Dans les exemples 1 et 2, que la chaîne vide menant devrait être ignorée.

    Je laisserai la fixation réelle du code, car ce est votre défi à résoudre.


1 commentaires

J'ai modifié la regex et déplacé "s = s.trim ()" juste après le "scan.close ()" et ça fonctionnait!



0
votes
if (scan.hasNext()) {
    s = scan.nextLine();
} else {
    System.out.println(0);
    return;
}
I edited your code a bit. For no String you have to use Scanner.hasNext(). If there is a String you will read it, otherwise just return and print 0.

2 commentaires

mais là vous venez de lire la première chaîne et non de plusieurs lignes, comme la question


@ AuryN31 Ouais à droite mais à cette question, l'entrée n'est qu'une ligne de cordes



0
votes

Le problème est avec .trim (), déplacez-le avant S.Length () mon code de travail xxx


0 commentaires