如何在java中将字符映射到数字位置?
例如
- 输入:[‘A’,’Z’,’F’,’D’,…]
- 输出:[0,25,5,3,…]
在C中,我只是从’A’中减去char,但我似乎无法在java中执行此操作。
您也可以使用Java中的字符进行简单的数学运算:
System.out.println('A' - 'A');
将输出0。
在String对象上使用indexOf
方法。 例如,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf('F')
返回5。
实际上,其他解决方案的弱点在于它们涉及字符串创建
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 }
您现在可以使用序数函数来获取此处的偏移量。 例如Alphabet.L.ordinal();
但是,由于我假设您正在处理函数,因此这是一个更有用的定义
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(String targ) { return valueOf(targ).ordinal(); } public static int getNum(char targ) { return valueOf(String.valueOf(targ)).ordinal(); } }
注意:与其他语言不同,您可以在其自己的文件中声明枚举,就像类一样。 实际上,如上所示的枚举也可以包含字段和方法,这些字段是静态创建的,并且很难打破。 实际上,使用仅包含本地方法和变量的枚举以及名为INSTANCE的单个枚举类型是创建单例的推荐方法,因为即使通过reflection它也是牢不可破的。
如果你不控制对函数的调用,你可能也想考虑在那里滑动toUppercase()调用
如果您希望更动态地创建字母而不是使用预定义的字母,那么您应该查看地图
您期望的输出只是大写字母相对于'A'
的offset
。 因此,只需从需要偏移的字母的unicode值中减去'A'
的Unicode值。
例如: 'B' - 'A' = 1
这是以对数时间运行的不同实现:
类
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)); } }
unit testing
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')); } }
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; return alphabet.indexOf( myChar );