在 Haxe 中反转字符串的其他选项是什么?我介绍我的(简单、清晰和初学者一样):
class ReverseString {
public static function main() {
Sys.println("Enter some words: ");
// Lets read some input!
var someWord = Sys.stdin().readLine();
// Split string to array, reverse string, and join again
var stringArray:Array<String> = someWord.split("");
stringArray.reverse();
var reversedString = stringArray.join("");
// And finally, enjoy the reversed string:
Sys.print("Reversed word looks like this: ");
Sys.println(reversedString);
}
}
Run Code Online (Sandbox Code Playgroud)
与其他一些方法相比,使用 split() 速度较慢,尤其是在字符串足够大的情况下。
下面的测试是在我的计算机上为 Neko 目标完成的,使用 Haxe 2.10 编译。让我们首先测试一个 6 个字符的字符串(“abcdef”)。
带有拆分/连接的实现 A大约需要(0.030 毫秒):
var s = "abcdef";
var a = s.split('');
a.reverse();
s = a.join('');
// s contains "fedcba"
Run Code Online (Sandbox Code Playgroud)
如果不比解决方案 A 慢(0.032 毫秒),则实现 B 的运行速度几乎同样慢:
var s = "abcdef";
var s2 = "";
for (i in -s.length+1...1)
s2 += s.charAt(-i);
// s2 contains "fedcba"
Run Code Online (Sandbox Code Playgroud)
实现 C比实现 A 快 5 倍(0.006 毫秒):
import StringBuf;
using StringTools;
var s = "abcdef";
var s2 = new StringBuf();
for (i in -s.length+1...1)
s2.add(s.charAt(-i));
// s2.toString() contains "fedcba"
Run Code Online (Sandbox Code Playgroud)
实现 D看起来最快,大约比实现 A 快 16 倍(0.002 毫秒):
import StringBuf;
using StringTools;
var s = "abcdef";
var s2 = new StringBuf();
for (i in -s.length+1...1)
s2.addChar(s.fastCodeAt(-i));
// s2.toString() contains "fedcba"
// if introducing var s3 = s2.toString() it then takes from 0.003 to 0.004ms total
// so this still seems the fastest on Neko.
Run Code Online (Sandbox Code Playgroud)
使用 6 个字符的字符串(从 500,000 次迭代计算并相应地划分)对 Neko 的测量进行回顾:
250 个字符的字符串测量值(根据 500,000 次迭代计算并相应划分):
结果表明,随着字符串大小的增加,实现 A 相对于 D 变得越来越慢(意味着其复杂度函数 O(n) 更糟)。
出于这些原因,我推荐实现 D。