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);
    }
}
4

2 回答 2

5

与其他一些方法相比,使用 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"

实现 B的运行速度与解决方案 A(0.032 毫秒)差不多,甚至比解决方案 A 还要慢:

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

// s2 contains "fedcba"

实现 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"

实现 D最快,比实现 A 快 16 倍(0.002ms):

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.

用 6 个字符的字符串(从 500,000 次迭代计算并相应划分)对 Neko 的测量值进行回顾:

  • 答:0.030ms
  • B:0.032ms(最差)
  • C:0.006ms(比A快5倍)
  • D:0.002ms(最好,比 A 快 16 倍)

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

  • 答:0.996ms
  • B:1.326ms(仍然最差)
  • C:0.166ms(比A快6倍)
  • D:0.044ms(最好,比 A 快 22 倍)

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

出于这些原因,我建议实施 D

于 2014-08-20T10:00:01.350 回答
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);
    }
}

使评论相当过时,不是吗?

或者,您可以向后迭代 String 的字符并将它们添加到 a StringBuf,但我猜这在大多数平台上都比较慢。

于 2012-11-10T12:43:31.160 回答