Je suis assez nouveau sur Java, je me demande donc comment convertir une lettre dans une chaîne en un nombre, par exemple hello world
générerait comme 8 5 12 12 15 23 15 18 12 4
.
alors a=1
, b=2
, z=26
etc.
Comme il s’agit très probablement d’une tâche d’apprentissage, je vais vous donner un indice: tous les points de code UNICODE pour les lettres de l’alphabet latin sont classés par ordre alphabétique. Si le code de a
est un nombre N
, le code de b
est N+1
, le code de c
est N+2
et ainsi de suite; le code de Z
est N+26
.
Vous pouvez soustraire des points de code de caractères de la même manière que vous soustrayez des entiers. Puisque les points de code sont classés par ordre alphabétique, le calcul suivant
char ch = 'h';
int pos = ch - 'a' + 1;
produit le numéro de séquence de h
, c'est-à-dire 8
. Si vous effectuez ce calcul en boucle, vous obtiendrez le résultat dont vous avez besoin.
Notez que la formule ci-dessus ne fonctionne qu'avec des caractères du même registre. Si votre chaîne de saisie est en casse mixte, vous devez convertir chaque caractère en minuscule avant de procéder au calcul, sinon il serait erroné.
String s = "hello world";
String t = "";
for (int i = 0; i < s.length(); ++i) {
char ch = s.charAt(i);
if (!t.isEmpty()) {
t += " ";
}
int n = (int)ch - (int)'a' + 1;
t += String.valueOf(n);
}
System.out.println(t);
Cela ne traite pas de l'espace, etc.
pour chaque caractère à la position i: sortie s.charAt (i) - 'a' + 1. s est la chaîne.
public static void main(String[] args) {
String s = "hello world";
s = s.replace(" ", "");
char[] c = s.toCharArray();
for (Character ss : c)
System.out.println(ss - 'a' + 1);
}
Usa une carte avec la clé étant le caractère et une valeur étant les entiers. Ce n'est pas un moyen efficace - la carte doit être un membre statique de la classe.
import Java.util.HashMap;
import Java.util.Map;
public class JavaApplication1
{
public static void main(String[] args)
{
final Map<Character, Integer> map;
final String str = "hello world";
map = new HashMap<>();
// or map = new HashMap<Character, Integer> if you are using something before Java 7.
map.put('a', 1);
map.put('b', 2);
map.put('c', 3);
map.put('d', 4);
map.put('e', 5);
map.put('f', 6);
map.put('g', 7);
map.put('h', 8);
map.put('i', 9);
map.put('j', 10);
map.put('k', 11);
map.put('l', 12);
map.put('m', 13);
map.put('n', 14);
map.put('o', 15);
map.put('p', 16);
map.put('q', 17);
map.put('r', 18);
map.put('s', 19);
map.put('t', 20);
map.put('u', 21);
map.put('v', 22);
map.put('w', 23);
map.put('x', 24);
map.put('y', 25);
map.put('z', 26);
for(final char c : str.toCharArray())
{
final Integer val;
val = map.get(c);
if(val == null)
{
// some sort of error
}
else
{
System.out.print(val + " ");
}
}
System.out.println();
}
}
Vous pouvez faire quelque chose comme:
for (int i = 0; i < a.length(); ++i) {
if (a.charAt(i) >= 'a' && a.charAt(i) <= 'z') {
System.out.println((int)a.charAt(i) - (int)'a');
}
}
Si vous avez besoin, vous pouvez utiliser le code testé ci-dessous pour convertir une chaîne en nombre si votre chaîne ne contient que des nombres et des alphabets.
public static Long getNumericReferenceNumber(String str) {
String result = "";
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (Character.isLetter(ch)) {
char initialCharacter = Character.isUpperCase(ch) ? 'A' : 'a';
result = result.concat(String.valueOf((ch - initialCharacter + 1)));
} else result = result + ch;
}
return Long.parseLong(result);
}
J'ai ajouté tous les personnages pour obtenir un résultat juste:
public static long stringToNumber(String s) {
long result = 0;
for (int i = 0; i < s.length(); i++) {
final char ch = s.charAt(i);
result += (int) ch;
}
return result;
}