Переворачивание строки в Haxe

Какие еще есть варианты перевернуть строку в 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);
    }
}

person wof    schedule 09.11.2012    source источник


Ответы (2)


Использование 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 мс):

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

// s2 contains "fedcba"

Реализация C в 5 раз быстрее, чем реализация A (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 кажется самой быстрой, примерно в 16 раз быстрее, чем реализация A (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.

Сводка измерений Neko с помощью строки из 6 символов (рассчитана на основе 500 000 итераций и разделена соответствующим образом):

  • A: 0.030ms
  • B: 0,032 мс (худшее)
  • C: 0,006 мс (в 5 раз быстрее, чем A)
  • D: 0,002 мс (лучшее, в 16 раз быстрее, чем A)

Измерения строки из 250 символов (рассчитаны на основе 500 000 итераций и разделены соответствующим образом):

  • A: 0.996ms
  • B: 1,326 мс (все еще худшее)
  • C: 0,166 мс (в 6 раз быстрее, чем A)
  • D: 0,044 мс (лучшее, в 22 раза быстрее, чем A)

Результаты показывают, что реализация A становится все медленнее и медленнее по сравнению с D по мере роста размера строки (это означает, что ее функция сложности O (n) хуже).

По этим причинам я рекомендую реализация D.

person the_yellow_logo    schedule 20.08.2014
comment
Пробовали ли вы другие цели? - person Georg; 28.04.2015

Вы можете вынести код в отдельную статическую функцию:

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, но я предполагаю, что на большинстве платформ это происходит медленнее.

person back2dos    schedule 10.11.2012
comment
Ваше решение более элегантно, поэтому я его покупаю. ;) - person wof; 10.11.2012