Invierta solo las letras en cadena y mantenga el mismo orden de las palabras

Necesito revertir solo letras en Cadena y mantener símbolos y números en el mismo lugar usando Character.isLettery también necesito mantener el mismo orden de las palabras invertidas. Mi código invierte una cadena y mantiene los símbolos y números en su lugar, pero cambia el orden de las palabras, por ejemplo:

Mi cadena de entrada:

a1bcd efg! h

Mi cadena de salida:

h1gfe dcb! a

En cambio, mi salida supone ser:

d1cba hgf! e

class AnagramsMaker {
    public static String createAnagram(String StringToReverse) {
        char[] stringToChar = StringToReverse.toCharArray();
        int arrayStart = 0;
        int arrayEnd = stringToChar.length - 1;

        while (arrayStart < arrayEnd) {
            if (Character.isLetter(stringToChar[arrayStart]) && Character.isLetter(stringToChar[arrayEnd])) {
                char temp = stringToChar[arrayStart];
                stringToChar[arrayStart] = stringToChar[arrayEnd];
                stringToChar[arrayEnd] = temp;

                arrayStart++;
                arrayEnd--;
            }
            else if (Character.isLetter(stringToChar[arrayStart]) && !Character.isLetter(stringToChar[arrayEnd])) {
                arrayEnd--;
            }
            else if (!Character.isLetter(stringToChar[arrayStart]) && Character.isLetter(stringToChar[arrayEnd])) {
                arrayStart++;
            }
            else {
                arrayStart++;
                arrayEnd--;
            }
        }

        return String.valueOf(stringToChar);
    }
}
Respuesta 1

Con la forma en que lo tiene actualmente, en realidad no necesita modificar su método y puede utilizarlo para revertir cada palabra en lugar de la totalidad Stringde una vez.

Cambié el nombre de su método actual public static String createAnagramWord(String StringToReverse)y luego creé el siguiente método:

public static String createAnagram(String str) {
    String anagram = "";
    String [] arr = str.split(" ");

    for (String s : arr) {
        anagram += createAnagramWord(s) + " ";
    }
    return anagram;
}

Donde uso tu método actual con createAnagramWord(s)dentro de él.

En este método, tenga en cuenta que dividí el Stringpasado en espacios en blanco con " "(también puede usarlo \\s+en su lugar, vea esta publicación), y luego iterar en la matriz devuelta por splitusar un forbucle mejorado .

Dentro del forbucle, lo nuevo Stringse crea agregando cada palabra invertida junto con un espacio.

Ejemplo de ejecución:

public static void main(String [] args) { 
    String reverse = "a1bcd efg!h";
    System.out.println(createAnagram(reverse));
}

Salida:

d1cba hgf! e

Nota: la
incorporación Stringde un bucle técnicamente debería utilizarse StringBuilder, sin embargo, creo que está fuera del alcance de esta pregunta y decidí omitirla.

Además, puede modificar esta lógica en su método actual si por alguna razón prefiere no separar la lógica en dos métodos separados.

Respuesta: 2
    String plain = "a1bcd efg!h";

    String reversed = Arrays.stream(plain.split(" ")).map(str -> {
        char[] chars = str.toCharArray();
        int i = 0;
        int j = chars.length - 1;
        while(i < j) {
            if(Character.isLetter(chars[i]) && Character.isLetter(chars[j])) {
                char tmp = chars[i];
                chars[i] = chars[j];
                chars[j] = tmp;
                i++;
                j--;
            } else if(!Character.isLetter(chars[i]))
                i++;
            else
                j--;
        }
        return new String(chars);
    }).collect(Collectors.joining(" "));

Puede hacerlo de manera más declerativa aprovechando las transmisiones de Java. Este código funciona pasando los caracteres especiales e invirtiendo los lugares de los caracteres ith y jth si ambos son caracteres válidos.

Respuesta: 3

La clase abstracta significa que tiene métodos abstractos y métodos concretos, pero incluso si solo tiene métodos concretos, se ve como un método normal solo correcto. Y por qué estamos declarando la clase ...

¿Cómo puedo convertir KeyEvent.VK_SPACE (que es un entero) en un espacio real? Espacio de cadena = convertKeyEvent (KeyEvent.VK_SPACE); System.out.println ("Espacio =" + espacio + "."); Esto debería generar Space = ...

Tengo un elemento sobre el que quiero realizar el mouseover para hacer visible otro elemento. Intenté con esto: nuevas acciones (controlador) .moveToElement (webElem) .perform (); Pero si muevo el mouse sobre el navegador, eso ...

Básicamente comprimo video usando la clase de compresor personalizada en Java. He reunido mis fragmentos de código completos aquí. Mi problema real es que el video generado [A.mp4] del byte descomprimido ...