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() の使用は他の方法に比べて遅くなります。

以下のテストは、Haxe 2.10 でコンパイルされた Neko ターゲット用のコンピューターで実行されます。最初に 6 文字の文字列 ("abcdef") をテストしてみましょう。

分割/結合を使用した実装 Aには約 (0.030ms) かかります。

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.006ms) よりも 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.002ms) よりも約 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.030ms
  • B: 0.032ms (最悪)
  • C: 0.006ms (Aの5倍速)
  • D: 0.002ms (最高、A の 16 倍の速さ)

250 文字の文字列の測定値(500,000 回の反復から計算され、それに応じて分割されます):

  • A: 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);
    }
}

コメントはかなり時代遅れになりますね。

または、文字列の文字を逆方向に繰り返して、それらをに追加することもできますが、StringBufほとんどのプラットフォームではこれは遅いと思います。

于 2012-11-10T12:43:31.160 に答える