仅旋转数组中某些元素的最快方法是什么?

What's the fastest way to only rotate certain elements in an array?

我正在为字符串编写一种单词加扰器,它接受除第一个和最后一个字母以外的所有字母,并旋转它们的位置。但是,我应该只看倒数第二个到第二个字母。我应该如何只从倒数第二个字母到倒数第二个字母?

例如争夺 "string" 到 "srintg"

我可以对通过拆分字符串创建的字符数组调用 Collections.rotate(),但这会打乱整个单词。

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

我想得到输出 "srintg",但我会得到 "rintgs"。

只要您的单词足够长(至少四个字母),您就可以通过旋转列表的子列表来使您介绍的方法起作用:

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

List.subList() 创建 List 列表的一部分的视图,其确切目的是避免使用在索引子范围上运行的版本重载 List 方法要素。也就是"fast"写起来快的意思,还算清楚。

但是,如果您在性能方面寻求 "fast",那么拆分和连接字符串似乎是不明智的。 Fastest 可能不是我们可以提供的,因为性能需要测试,但如果我正在寻找最佳性能,那么我至少会测试这些通用方法:

  • 使用你的单词的数组形式
    1. 使用String.toCharArray()以数组形式获取单词的字母。
    2. 使用索引 for 循环旋转数组中的字符。
    3. 从修改后的数组构造一个新的 String(使用适当的构造函数)。
  • 使用StringBuilder到assemble这个词
    1. 创建一个初始容量等于字长的StringBuilder
    2. 使用 CharacterIterator 遍历单词的字母,按要求的顺序将它们附加到构建器中。这可以一次完成。
    3. 从生成器中获取结果字符串。