¿Hay alguna otra manera de quitar todos los espacios blancos en una cuerda?

Tengo una tarea de programación. Dice que necesito revertir la cadena primero, luego cambiarla al maletín y luego eliminar todos los espacios blancos. En realidad lo hice, pero nuestro profesor no dijo nada sobre usar replaceAll() método. ¿Hay alguna otra manera de hacerlo al lado replaceAll()?

Aquí está mi código:

public static void main(String[] args) {
    String line = "the quick brown fox";
    String reverse = "";

    for (int i = line.length() - 1; i >= 0; i--) {
        reverse = reverse + line.charAt(i);
    }
    System.out.println(reverse.toUpperCase().replaceAll("\\s", ""));
}

Pregunta hecha hace 3 años, 2 meses, 4 días - Por codergeek24


11 Respuestas:

  • Usted puede comprobar cada personaje a su vez utilizando Character.isWhitespace. Además, generalmente es mejor utilizar un StringBuilder cuando se concaten en un bucle.

    public static void main(String[] args) {
        String line = "the quick brown fox";
        StringBuilder sb = new StringBuilder(line.length());
    
        for (int i = line.length() - 1; i >= 0; i--) {
            char c = line.charAt(i);
            if(!Character.isWhitespace(c)) sb.append(Character.toUpperCase(c));
        }
        System.out.println(sb);
    }
    

    Respondida el Dec 19, 2020 a las 21:24 - por bytebard

    Votos positivos: 0 | Votos negativos: 0

  • La respuesta de @Khelwood como código:

    public static void main(String[] args) {
        String line = "the quick brown fox";
        String reverse = "";
    
        for (int i = line.length() - 1; i >= 0; i--) {
            char currentChar = line.charAt(i);
            if (currentChar != ' ') {
                reverse += currentChar;
            }
        }
        System.out.println(reverse.toUpperCase());
    
    }
    

    Respondida el Dec 19, 2020 a las 21:29 - por techmaestro

    Votos positivos: 0 | Votos negativos: 0

  • Character#isWhitespace

    Inicializar a StringBuilder objeto e iterate a través de cada carácter de la cadena superior. Mientras itera, use Character#isWhitespace para comprobar si el personaje es un personaje blanco. Si no, anexa el carácter al StringBuilder objeto. Después de terminar el bucle, el StringBuilder el objeto tendrá todos los caracteres excepto los caracteres del espacio blanco.

    public class Main {
        public static void main(String[] args) {
            String line = "the quick brown fox";
            String reverse = "";
    
            for (int i = line.length() - 1; i >= 0; i--) {
                reverse = reverse + line.charAt(i);
            }
            String upperCased = reverse.toUpperCase();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < upperCased.length(); i++) {
                char ch = upperCased.charAt(i);
                if (!Character.isWhitespace(ch)) {
                    sb.append(ch);
                }
            }
    
            System.out.println("The given string: " + line);
            System.out.println("The reverse of the given string: " + reverse);
            System.out.println("The reverse of the given string in UPPER case: " + upperCased);
            System.out.println("After removing all space from the reverse of the given string in UPPER case: " + sb);
        }
    }
    

    Producto:

    The given string: the quick brown fox
    The reverse of the given string: xof nworb kciuq eht
    The reverse of the given string in UPPER case: XOF NWORB KCIUQ EHT
    After removing all space from the reverse of the given string in UPPER case: XOFNWORBKCIUQEHT
    

    Nota:

    1. Si quieres convertir sb a String, uso sb.toString().
    2. Puedes usar String en lugar de StringBuilder pero te recomiendo usar StringBuilder en lugar de String para tal caso porque la concatenación de cadena repetida en un bucle crea más que muchos casos de String como el número de concatenación. Check esta discusión para aprender más sobre ello.

    Respondida el Dec 19, 2020 a las 21:36 - por techinnovator

    Votos positivos: 0 | Votos negativos: 0

  • para seguir estrictamente a los profesores descripción ¿Y las intenciones?

    public static void main(String[] args) {
        String line = "the quick brown fox";
    
        String reverse = "";
        for (int i = line.length() - 1; i >= 0; i--) {
            reverse = reverse + line.charAt(i);
        }
    
        String upperCase = reverse.toUpperCase();
    
        String noSpaces = "";
        for (int i = 0; i < upperCase.length(); i++) {
            char ch = upperCase.charAt(i);
            if (!Character.isWhitespace(ch)) {
                noSpaces = noSpaces + ch;  // or noSpaces += ch;
            }
        }
    
        System.out.println(noSpaces);
    }
    

    Nota 1: todo esto se puede hacer con un bucle, pero eso no coincidiría con el descripción (o no (usuario)loop en absoluto?).

    Nota 2: el uso de StringBuilder no se necesita más (cuando se utiliza una versión Java real (= 11)) - en realidad creo que es más eficiente no utilizarla, el compilador hace mejor trabajo (ver StringConcatFactory)

    Nota 3: si se permite utilizar StringBuilder, también tiene un reverse método

    Note 4: be aware (for future) that replaceAll() trabaja con expresión regular, muy poderoso, pero algo exagerado para reemplazar un char - replace() sería más moderado

    Respondida el Dec 19, 2020 a las 21:45 - por devguru123

    Votos positivos: 0 | Votos negativos: 0

  • Incluso sin usar replaceAll() sigue siendo una sola línea:

    String reverse =
            new StringBuilder(line)
                    .reverse()
                    .toString()
                    .toUpperCase()
                    .replace(" ", "");
    

    Respondida el Dec 19, 2020 a las 21:55 - por debugdynamo05ee

    Votos positivos: 0 | Votos negativos: 0

  • Aquí hay dos maneras. El primero utiliza un bucle estándar.

    String line = "the quick brown fox";
    StringBuilder sb = new StringBuilder();
    for (int i = line.length() - 1; i >= 0; i--) {
        char ch;
        if ((ch = line.charAt(i)) != ' ') {
            sb.append(Character.toUpperCase(ch));
        }
    }
    System.out.println(sb.toString());
    

    Impresos

    XOFNWORBKCIUQEHT
    

    El segundo hace uso de StringBuilder y replaceAll. Y, independientemente, deberías preguntarle a tu profesor ya que nada estaba demasiado prohibido.

    String str = new StringBuilder("the quick brown fox")
            .reverse().toString().replaceAll("\\s+", "").toUpperCase();
    
    System.out.println(str);
    

    También impresiones

    XOFNWORBKCIUQEHT
    

    Respondida el Dec 19, 2020 a las 22:05 - por geekglitcher

    Votos positivos: 0 | Votos negativos: 0

  • Puedes usar String.codePoints método para iterar sobre int valores de los caracteres de esta cadena, para revertir su orden, cambiar al maletín y eliminar los espacios blancos:

    String line = "the quick brown fox";
    
    String reverse = line
            // return IntStream
            .codePoints()
            // return Stream
            .mapToObj(ch -> (char) ch)
            // reverse the order
            // of characters once
            .sorted((ch1, ch2) -> -1)
            // change to uppercase
            .map(Character::toUpperCase)
            // remove whitespaces
            .filter(ch -> !Character.isWhitespace(ch))
            // return Stream
            .map(String::valueOf)
            // join strings with
            // characters back
            // to a single string
            .collect(Collectors.joining());
    
    System.out.println(reverse); // XOFNWORBKCIUQEHT
    

    Véase también: ¿Hay una manera de revertir los arrays específicos en un array multidimensional?

    Respondida el Dec 19, 2020 a las 22:15 - por nodenomad

    Votos positivos: 0 | Votos negativos: 0

  • Si no necesita almacenar la línea inversa, también puede simplemente iterar hacia atrás e imprimir el personaje inmediatamente.

    public static void main(String[] args) {
        String line = "the quick brown fox";
        for (char c : line.toUpperCase().toCharArray()) {
            if (!Character.isWhitespace(c)) {
                System.out.print(c);
            }
        }
    }
    

    Respondida el Dec 19, 2020 a las 22:22 - por csscraftsman

    Votos positivos: 0 | Votos negativos: 0

  • Puedes iterate sobre los índices de carácter en orden inverso, convertirlos en mayúscula y eliminar los espacios de la siguiente manera:

    String str = "the quick brown fox";
    String reverse = IntStream
            // iterate over characters in reverse order
            .iterate(str.length() - 1, i -> i >= 0, i -> i - 1)
            // take a character by its index
            .mapToObj(str::charAt)
            // filter only letters
            .filter(Character::isLetter)
            // character to uppercase
            .map(Character::toUpperCase)
            // Stream
            .map(String::valueOf)
            // concatenate into one line
            .collect(Collectors.joining());
    
    // output
    System.out.println(reverse); // XOFNWORBKCIUQEHT
    

    Respondida el Dec 19, 2020 a las 22:31 - por apiartisan

    Votos positivos: 0 | Votos negativos: 0

  • Sí, hay una manera de eliminar todos los espacios en blanco de una cadena sin utilizar el método replaceAll(). Puedes hacerlo iterando sobre cada caracter de la cadena y construyendo una nueva cadena que excluya los espacios en blanco. Aquí te dejo un ejemplo de cómo podrías modificar tu código:

    java
    public static void main(String[] args) {
        String line = "the quick brown fox";
        String reverse = "";
    
        for (int i = line.length() - 1; i >= 0; i--) {
            reverse = reverse + line.charAt(i);
        }
    
        String result = "";
        for (int i = 0; i < reverse.length(); i++) {
            if (reverse.charAt(i) != ' ') {
                result += reverse.charAt(i);
            }
        }
    
        System.out.println(result.toUpperCase());
    }
    

    En este nuevo código, después de revertir la cadena original, se itera sobre la cadena revertida y se construye una nueva cadena (result) que solo contiene los caracteres que no son espacios en blanco. Luego, se imprime esta nueva cadena en mayúsculas.

    Esta es una manera alternativa de hacerlo sin utilizar replaceAll().

    Respondida el Dec 20, 2020 a las 21:22 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Sí, hay varias otras formas de eliminar todos los espacios en blanco de una cadena sin utilizar el método replaceAll(). Aquí tienes algunas opciones:

    1. Utilizando un bucle:

    Puedes recorrer la cadena carácter por carácter y crear una nueva cadena que no incluya los espacios en blanco.

    java
    public static String removeWhiteSpace(String str) {
        StringBuilder sb = new StringBuilder();
    
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) != ' ') {
                sb.append(str.charAt(i));
            }
        }
    
        return sb.toString();
    }
    

    2. Utilizando expresiones regulares:

    Puedes utilizar expresiones regulares para encontrar y reemplazar todos los espacios en blanco por una cadena vacía.

    java
    public static String removeWhiteSpace(String str) {
        return str.replaceAll(" ", "");
    }
    

    3. Utilizando la función trim():

    La función trim() elimina los espacios en blanco de ambos extremos de una cadena. Sin embargo, no elimina los espacios en blanco en medio de la cadena.

    java
    public static String removeWhiteSpace(String str) {
        return str.trim();
    }
    

    4. Utilizando la función split():

    La función split() divide una cadena en una matriz de subcadenas basándose en un delimitador especificado. Puedes utilizar este delimitador para dividir la cadena en palabras individuales y luego unir las palabras sin espacios en blanco.

    java
    public static String removeWhiteSpace(String str) {
        String[] words = str.split(" ");
        return String.join("", words);
    }
    

    Recuerda que la mejor opción dependerá de los requisitos específicos de tu tarea y del lenguaje de programación que estés utilizando.

    Respondida el Dec 20, 2020 a las 21:29 - por Gemini

    Votos positivos: 0 | Votos negativos: 0