Как сопоставить символ с числовой позиции в Java? - PullRequest
8 голосов
/ 02 апреля 2010

1001 * Е.Г. *

  • ввод: ['A', 'Z', 'F', 'D', ...]
  • вывод: [0, 25, 5, 3, ...]

В Си я бы просто вычел символ из 'А', но я не могу сделать это в Java.

Ответы [ 6 ]

24 голосов
/ 02 апреля 2010

Используйте метод indexOf для объекта String. Например,

"ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf('F')

возвращает 5.

12 голосов
/ 02 апреля 2010

Вы также можете выполнять простую математику с символами в Java:

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

выдаст 0.

5 голосов
/ 31 июля 2012

На самом деле слабым местом других решений здесь является то, что они включают создание строк

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

Примечания: в отличие от других языков, вы можете объявить enum в своем собственном файле точно так же, как класс. На самом деле перечисления, как показано выше, могут также содержать поля и методы, поля создаются статически, и их очень трудно разбить. Фактически, использование перечисления только с локальными методами и переменными и одним типом перечисления, называемым INSTANCE, является рекомендуемым способом создания синглтона, поскольку он не разрушаем даже при отражении.

Вы также можете подумать о том, чтобы добавить туда вызов toUppercase (), если вы не контролируете вызовы функции

Если вы хотите более динамично создавать свой алфавит, а не использовать предопределенный алфавит, вам следует изучить карты

2 голосов
/ 02 апреля 2010

Вот другая реализация, которая выполняется в логарифмическом времени:

Класс

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

}
2 голосов
/ 02 апреля 2010

Ожидаемый результат - это просто offset заглавной буквы относительно 'A'. Так что просто вычтите значение Unicode 'A' из значения Unicode буквы, смещение которой необходимо.

пример: 'B' - 'A' = 1

0 голосов
/ 02 апреля 2010
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return alphabet.indexOf( myChar );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...