如何将字符映射到java中的数字位置?

时间:2010-04-02 01:01:26

标签: java

E.g。

  • 输入:['A','Z','F','D',...]
  • 输出:[0,25,5,3,...]

在C中,我只是从'A'中减去char,但我似乎无法在java中执行此操作。

7 个答案:

答案 0 :(得分:24)

在String对象上使用indexOf方法。例如,

"ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf('F')

返回5.

答案 1 :(得分:12)

您也可以使用Java中的字符进行简单的数学运算:

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

将输出0。

答案 2 :(得分: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的单个枚举类型是创建单例的推荐方法,因为即使通过反射它也是牢不可破的。

如果您没有控制对函数的调用,您可能还想考虑在那里滑动toUppercase()调用

如果您希望更动态地创建字母而不是使用预定义的字母,那么您应该查看地图

答案 3 :(得分:2)

您期望的输出只是offset的大写字母的'A'。因此,只需从需要偏移的字母的unicode值中减去'A'的Unicode值。

示例:'B' - 'A' = 1

答案 4 :(得分:2)

以下是以对数时间运行的不同实现:

<强>类

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));                
    }
}

单元测试

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'));
    }

}

答案 5 :(得分:0)

您可以使用java.lang.Character.toUpperCase('a') - 65;

答案 6 :(得分:-1)

String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return alphabet.indexOf( myChar );