在Haxe中反转字符串

4
有哪些其他方法可以在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);
    }
}
2个回答

6

相比其他方法,尤其是当字符串足够大时,使用split()的速度比较慢。

下面的测试是在我的电脑上对Neko目标进行的,使用Haxe 2.10编译。首先,我们来测试一个6个字符的字符串("abcdef")。

实现方案A使用split/join需要大约(0.030毫秒):

var s = "abcdef"; 
var a = s.split(''); 
a.reverse(); 
s = a.join('');

// s contains "fedcba"

实现B的运行速度与方案A相当慢,甚至可能更慢(0.032毫秒):

var s = "abcdef";
var s2 = ""; 
for (i in -s.length+1...1) 
    s2 += s.charAt(-i);

// s2 contains "fedcba"

实现方式 C比实现方式 A (0.006毫秒) 快5倍:

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"

实现D 似乎是最快的,大约比实现A(0.002毫秒)快16倍:

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.

Neko使用6个字符字符串的测量摘要(从500,000次迭代计算并相应地分割):

  • A:0.030毫秒
  • B:0.032毫秒(最差)
  • C:0.006毫秒(比A快5倍)
  • D:0.002毫秒(最佳,比A快16倍)

250个字符字符串的测量(从500,000次迭代计算并相应地分割):

  • A:0.996毫秒
  • B:1.326毫秒(仍然最差)
  • C:0.166毫秒(比A快6倍)
  • D:0.044毫秒(最佳,比A快22倍)

结果表明,随着字符串大小的增长(意味着其复杂度函数O(n)更差),实现A相对于D变得越来越慢。

出于这些原因,我推荐实现D


1
你尝试过其他目标吗? - Georg

3
你可以将代码移动到一个单独的静态函数中:
class StringUtil {
    static public function reverse(s:String):String {
        var a = s.split('');
        a.reverse();
        return a.join('');
    }
}

然后执行以下操作:

using StringUtil;

class ReverseString {

    public static function main() {

        Sys.print("Enter some words: ");
        // Lets read some input!
        var someWord = Sys.stdin().readLine();

        // Just reverse it
        var reversedString = someWord.reverse();

        // And finally, enjoy the reversed string:
        Sys.print("Reversed word looks like this: ");
        Sys.println(reversedString);
    }
}

让这个评论变得有些过时了,是不是?或者您可以反向迭代字符串的字符并将它们添加到StringBuf中,但我猜在大多数平台上速度会更慢。

你的解决方案更加优雅,因此我会购买它。 ;) - wof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接