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,

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

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

  1. Primero convierta el F en algún carácter. '*' por ejemplo. La cadena es ahora ** 00 * 0
  2. Gire 0 en F La cadena es ahora: ** FF * F
  3. 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

  • Diferencia de regex de Java y Android
  • ¿Cuál es la forma más fácil de dibujar textura con OpenGL ES?
  • Posible pérdida de memoria a través de FinalizerReference
  • cómo pasar los parámetros a la urlconnection en java / android?
  • GetSerializableExtra devolver null
  • Android - notifyDataSetChanged () no funciona
  • SimpleDateFormat ParseException: Unparseable date Error
  • MBTilesRasterDataSource no se encuentra en nutiteq SDK?
  • Universal-Image-Loader: mapas de bits erróneos se adjuntan a ImageView
  • ¿Por qué mostrar java.lang.ClassCastException: android.text.SpannableString no se puede transmitir a java.lang.String?
  • Dibujable en Vista obteniendo aplastado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.