Comment mapper un caractère sur une position numérique en java?

Par exemple

  • entrée: [‘A’, ‘Z’, ‘F’, ‘D’, …]
  • sortie: [0, 25, 5, 3, …]

En C, je soustrais simplement le caractère de ‘A’, mais je ne semble pas pouvoir le faire en java.

Vous pouvez également faire des calculs simples avec des caractères en Java:

System.out.println('A' - 'A'); 

affichera 0.

Utilisez la méthode indexOf sur un object Ssortingng. Par exemple,

"ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf('F')

renvoie 5.

en fait le point faible des autres solutions ici est qu’elles impliquent la création de chaîne

 public enum Alphabet { A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z } 

vous pouvez maintenant utiliser la fonction ordinale pour obtenir le décalage ici. Par exemple, Alphabet.L.ordinal ();

Cependant, puisque je suppose que vous avez affaire à des fonctions, voici une définition plus utile

 public enum Alphabet { A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z; public static int getNum(Ssortingng targ) { return valueOf(targ).ordinal(); } public static int getNum(char targ) { return valueOf(Ssortingng.valueOf(targ)).ordinal(); } } 

Notes: contrairement aux autres langues, vous pouvez déclarer une enum dans son propre fichier, exactement comme une classe. En réalité, les énoncés énumérés ci-dessus peuvent également contenir des champs et des méthodes. Les champs sont créés de manière statique et sont très difficiles à décomposer. En fait, l’utilisation d’un enum avec uniquement des méthodes et des variables locales et un seul type enum appelé INSTANCE est la méthode recommandée pour créer un singleton, car il est indissociable, même par reflection.

Vous voudrez peut-être aussi y insérer un appel toUppercase () si vous ne contrôlez pas les appels de la fonction

Si vous souhaitez créer votre alphabet de manière plus dynamic plutôt que d’utiliser un alphabet prédéfini, vous devriez vous pencher sur les cartes.

Le résultat attendu est simplement le offset d’une lettre majuscule par rapport à 'A' . Il suffit donc de soustraire la valeur Unicode de 'A' de la valeur Unicode de la lettre dont le décalage est nécessaire.

exemple: 'B' - 'A' = 1

Voici différentes implémentations qui fonctionnent en temps logarithmique:

Classe

 import java.util.Arrays; import java.util.Collections; public class CharacterIndex { private char[] characters = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; public int index(char character) { assert characters != null; return Arrays.binarySearch(characters, Character.toUpperCase(character)); } } 

Test de l’unité

 import org.junit.Before; import org.junit.Test; import static junit.framework.Assert.assertEquals; public class CharacterIndexTest { private CharacterIndex characterIndex; @Before public void createIndex() { characterIndex = new CharacterIndex(); } @Test public void testIndexOfLetterA() { assertEquals(0, characterIndex.index('A')); assertEquals(0, characterIndex.index('a')); } @Test public void testNotALetter() { assertEquals(-1, characterIndex.index('1')); } } 
 Ssortingng alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; return alphabet.indexOf( myChar );