Я пишу форму скремблера слов для строк, которая принимает все буквы, кроме первой и последней, и меняет их позиции. Однако я должен смотреть только на предпоследние буквы. Как я должен карабкаться только от предпоследней буквы к предпоследней букве?
например скремблировать "string" в "srintg"
Я могу вызвать Collections.rotate() для массива символов, созданного путем разделения строки, но это зашифрует все слово.
List<String> newWordList = Arrays.asList(word.split(" "));
Collections.rotate(newWordList, -1);
String newWord = String.join("", newWordList);
Я хочу получить вывод "srintg", но вместо этого я получу "ringgs".
Вы хотите повернуть только 2-й и 2-й последний? Или все, кроме 1-го и последнего? "берет все буквы, кроме первой и последней", "смотреть только на предпоследние буквы"
При условии, что ваше слово достаточно длинное, чтобы быть осмысленным (по крайней мере, четыре буквы), вы можете сделать так, чтобы подход, который вы представляете, работал, меняя подсписок вашего списка:
Collections.rotate(newWordList.subList(1, newWordList.size() - 1), -1);
List.subList()
создает представление части списка List
именно для того, чтобы избежать необходимости перегружать методы List
версиями, которые работают с индексированными поддиапазонами элементов. Это «быстро» в смысле быстрой записи, и это довольно ясно.
Однако, если вы ищете «быстрый» в смысле производительности, то разделение и объединение строк кажется нецелесообразным. Fastстандартное восточное время, вероятно, не то, что мы можем предложить, так как производительность должна быть протестирована, но если бы я искал лучшую производительность, я бы протестировал, по крайней мере, эти общие подходы:
String.toCharArray()
, чтобы получить буквы вашего слова в виде массива.for
для поворота символов в массиве.String
из измененного массива (используя соответствующий конструктор).StringBuilder
, чтобы собрать слово
StringBuilder
с начальной емкостью, равной длине слова.CharacterIterator
, добавляя их в конструктор в нужном порядке. Это можно сделать за один проход.
Что вы подразумеваете под «самым быстрым способом»? У вас очень большой набор данных или это вызов?