仅旋转数组中某些元素的最快方法是什么?
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 可能不是我们可以提供的,因为性能需要测试,但如果我正在寻找最佳性能,那么我至少会测试这些通用方法:
- 使用你的单词的数组形式
- 使用
String.toCharArray()
以数组形式获取单词的字母。
- 使用索引
for
循环旋转数组中的字符。
- 从修改后的数组构造一个新的
String
(使用适当的构造函数)。
- 使用
StringBuilder
到assemble这个词
- 创建一个初始容量等于字长的
StringBuilder
- 使用
CharacterIterator
遍历单词的字母,按要求的顺序将它们附加到构建器中。这可以一次完成。
- 从生成器中获取结果字符串。
我正在为字符串编写一种单词加扰器,它接受除第一个和最后一个字母以外的所有字母,并旋转它们的位置。但是,我应该只看倒数第二个到第二个字母。我应该如何只从倒数第二个字母到倒数第二个字母?
例如争夺 "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 可能不是我们可以提供的,因为性能需要测试,但如果我正在寻找最佳性能,那么我至少会测试这些通用方法:
- 使用你的单词的数组形式
- 使用
String.toCharArray()
以数组形式获取单词的字母。 - 使用索引
for
循环旋转数组中的字符。 - 从修改后的数组构造一个新的
String
(使用适当的构造函数)。
- 使用
- 使用
StringBuilder
到assemble这个词- 创建一个初始容量等于字长的
StringBuilder
- 使用
CharacterIterator
遍历单词的字母,按要求的顺序将它们附加到构建器中。这可以一次完成。 - 从生成器中获取结果字符串。
- 创建一个初始容量等于字长的