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

Я пишу форму скремблера слов для строк, которая принимает все буквы, кроме первой и последней, и меняет их позиции. Однако я должен смотреть только на предпоследние буквы. Как я должен карабкаться только от предпоследней буквы к предпоследней букве?

например скремблировать "string" в "srintg"

Я могу вызвать Collections.rotate() для массива символов, созданного путем разделения строки, но это зашифрует все слово.

List<String> newWordList = Arrays.asList(word.split(" "));
Collections.rotate(newWordList, -1);
String newWord = String.join("", newWordList);

Я хочу получить вывод "srintg", но вместо этого я получу "ringgs".

Что вы подразумеваете под «самым быстрым способом»? У вас очень большой набор данных или это вызов?

dustytrash 09.04.2019 15:43

Вы хотите повернуть только 2-й и 2-й последний? Или все, кроме 1-го и последнего? "берет все буквы, кроме первой и последней", "смотреть только на предпоследние буквы"

dustytrash 09.04.2019 15:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При условии, что ваше слово достаточно длинное, чтобы быть осмысленным (по крайней мере, четыре буквы), вы можете сделать так, чтобы подход, который вы представляете, работал, меняя подсписок вашего списка:

Collections.rotate(newWordList.subList(1, newWordList.size() - 1), -1);

List.subList() создает представление части списка List именно для того, чтобы избежать необходимости перегружать методы List версиями, которые работают с индексированными поддиапазонами элементов. Это «быстро» в смысле быстрой записи, и это довольно ясно.

Однако, если вы ищете «быстрый» в смысле производительности, то разделение и объединение строк кажется нецелесообразным. Fastстандартное восточное время, вероятно, не то, что мы можем предложить, так как производительность должна быть протестирована, но если бы я искал лучшую производительность, я бы протестировал, по крайней мере, эти общие подходы:

  • Работа с формой массива вашего слова
    1. Используйте String.toCharArray(), чтобы получить буквы вашего слова в виде массива.
    2. Используйте индексированный цикл for для поворота символов в массиве.
    3. Создайте новый String из измененного массива (используя соответствующий конструктор).
  • Используйте StringBuilder, чтобы собрать слово
    1. Создайте StringBuilder с начальной емкостью, равной длине слова.
    2. Перебирайте буквы слова с помощью CharacterIterator, добавляя их в конструктор в нужном порядке. Это можно сделать за один проход.
    3. Получите строку результата от построителя.

Другие вопросы по теме