Как упростить поиск индекса элемента в массиве?

Можно ли упростить такой код?

logicString.charAt(Arrays.stream(logicTTArray).toList().indexOf(currentType));

Ответы (1 шт):

Автор решения: Nowhere Man

Преобразование в stream с последующей конвертацией в список излишне, массив конвертируется в список при помощи классического метода Arrays.asList или List.of, начиная с Java 9:

logicString.charAt(Arrays.asList(logicTTArray).indexOf(currentType));

Если массив logicTTArray отсортирован, можно использовать более быстрый бинарный поиск Arrays.binarySearch:

logicString.charAt(Arrays.binarySearch(logicTTArray, currentType));

Однако, поскольку суть задачи состоит в том, что требуется найти некий символ в строке logicString, расположенный по индексу элемента currentType в массиве logicTTArray, можно предложить решение на основе некоторого перечисления, хранящего символы для каждого "ключа" currentType (вместо строки logicString).

Тогда поиск будет реализован за постоянное время:

enum MyType {
    A('a'), B('b'),
    // ...
    Y('y'), Z('z');

    private char symbol;

    private MyType(char c) { this.symbol = c;}

    public char getSymbol() { return this.symbol;}
}

Здесь эквивалентом массива logicTTArray может быть массив значений перечисления MyType.values(), и соответственно currentType будет сразу содержать нужный символ:

MyType currentType = MyType.Z;
char tt = currentType.getSymbol();
→ Ссылка