Sustitución repetida de caracteres en String
Estoy tratando de crear una aplicación de Android que convierte el código hexadecimal normal invertido que se utiliza en smali. Todo funciona perfectamente a excepción de que cuando uso el método replace o replaceAll en String, incluso sustituye a los caracteres ya reemplazados
Por ejemplo,
- ¿Cómo correctamente y consistentemente se burlan de la ubicación en Android?
- Eclipse no crea nueva actividad y archivo de diseño xml (problemas iniciados después de actualizar eclipse y sdk)
- Android Studio no puede resolver el símbolo pero el código se ejecuta correctamente
- Android Edited: setOnFocusChangeListener no funciona
- ¿Por qué java.text.DateFormat devuelve el mismo formato de fecha para en_US y en_GB en Android?
String stringInvert = string.replace("F", "0") .replace("E" , "1") .replace("D" , "2") .replace("C" , "3") .replace("B" , "4") .replace("A" , "5") .replace("9" , "6") .replace("8" , "7") .replace("7" , "8") .replace("6" , "9") .replace("5" , "A") .replace("4" , "B") .replace("3" , "C") .replace("2" , "D") .replace("1" , "E") .replace("0" , "F");
Como se puede ver que primero F se cambia a 0, y de manera similar otras letras también se cambian, pero más tarde 0 se cambia a F, que también cambia el F ya cambiado a F. Así que, en general, sólo las letras / números Que son antes de 7 se invierten (como se sustituyen después en el código) y otros siguen siendo los mismos debido a la inversión doble. Incluso probé método replaceAll, da el mismo resultado. ¿Hay alguna otra manera o un trabajo alrededor a este problema?
El código completo está aquí – http://pastebin.com/dB23JmQG
Lo siento si el código es feo, lo hice en AIDE
Gracias
- ¿Por qué la cámara del emulador androide se detiene inesperadamente?
- Flurry Agent que causa una excepción CalledFromWrongThreadException en Android 2.3.4
- Timer.scheduleAtFixedRate no se detiene cuando llamo cancelar
- Cómo reiniciar un hilo en Android?
- Android .setColor para Icono grande
- Estudio de Android java.lang.NoClassDefFoundError: android.support.v4.app.NavUtilsJB
- Http get exception El host de destino no debe ser null en ICS
- Mostrar un RecyclerView en Fragmento
Podrías crear un Map<Character, Character>
que mantendrá tu asignación.
A continuación, sólo iterar otro de la String
original.
Map<Character, Character> m = new HashMap<>(); m.put('F','0'); .... StringBuilder sb = new StringBuilder(); for(char c : originalString.toCharArray()){ sb.append(map.get(Character.toUpperCase(c))); } String finalString = sb.toString();
Puede intentar reemplazarlo con varios pasos como este:
String stringInvert = string .replace("F", "null") .replace("E" , "one") .replace("D" , "two") .replace("C" , "three") .replace("B" , "four") .replace("A" , "five") .replace("9" , "six") .replace("8" , "seven") .replace("7" , "8") .replace("6" , "9") .replace("5" , "A") .replace("4" , "B") .replace("3" , "C") .replace("2" , "D") .replace("1" , "E") .replace("0" , "F") .replace("null", "0") .replace("one","1") .replace("two","2" ) .replace("three","3" ) .replace("four","4" ) .replace("five","5" ) .replace("six","6" ) .replace("seven","7" );
No es agradable e inteligente, pero sencillo y funcional 🙂
Puede resolver el problema sustituyendo un dígito hexadecimal por un carácter temporal antes de sobrescribir su posición.
Esto es similar a la clase de burbuja algorithem. Para un ejemplo vamos a utilizar la siguiente cadena: FF00F0
- Primero convierta el F en algún carácter. '*' por ejemplo. La cadena es ahora ** 00 * 0
- Gire 0 en F La cadena es ahora: ** FF * F
- Finalmente gire el * a 0.
Hay soluciones mucho más eficientes, pero este es simple y rápido de programar.
Esto no funcionará para asignaciones aleatorias de caracteres a otros caracteres, pero como el suyo tiene un patrón, puede crear una función que convierta cada carácter con sus valores char / int, por ejemplo:
static char convert(char c){ int n = c; n = n - 70; // Adjust for capital F n = n * -1; // So earlier letters become larger numbers n += 48; // Adjust back to zero return (char)n; }
Este método tomará cualquiera de los caracteres de la letra y devolverá el carácter numérico equivalente (y la función equivalente para los caracteres numéricos debería ser clara), así que simplemente haga un bucle a través de la conversión de cada uno individualmente.
Si te interesa la velocidad, esto debería ser bastante rápido, especialmente si puedes usar matrices de caracteres en lugar de cadenas.
Una solución alternativa podría ser utilizar Integer
API:
String stringToInvert = "A1F56C"; StringBuilder sb = new StringBuilder(); for (char c : stringToInvert.toCharArray()) { sb.append(Integer.toHexString(15 - Integer.valueOf(c + "", 16))); } System.out.println(sb.toString().toUpperCase());
Salida:
5E0A93