代码之家  ›  专栏  ›  技术社区  ›  Alex Budovski

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

  •  8
  • Alex Budovski  · 技术社区  · 16 年前

    例如。

    • 输入:['a'、'z'、'f'、'd'、…]
    • 输出:[0,25,5,3,…]

    在C中,我只需要从A中减去char,但在Java中我似乎不能这样做。

    6 回复  |  直到 16 年前
        1
  •  12
  •   jarnbjo    16 年前

    你也可以用Java中的字符来做简单的数学运算:

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

    将输出0。

        2
  •  23
  •   Etaoin    16 年前

    使用 indexOf 字符串对象上的方法。例如,

    "ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf('F')

    返回5。

        3
  •  5
  •   K.Barad    13 年前

    实际上,这里其他解决方案的弱点在于它们涉及到字符串的创建

    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的单个枚举类型的枚举来创建singleton,因为它即使通过反射也是不可破坏的。

    如果不控制对函数的调用,您可能还需要考虑将touppercase()调用滑入其中。

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

        4
  •  2
  •   codaddict    16 年前

    您期望的输出只是 offset 大写字母的 'A' . 所以只需减去 “A” 从需要偏移量的字母的Unicode值。

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

        5
  •  2
  •   yakshaver    16 年前

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

    等级

    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'));
        }
    
    }
    
        6
  •  -1
  •   Stefan Kendall    16 年前
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    return alphabet.indexOf( myChar );