Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Сравнение строк


logg

Рекомендуемые сообщения

Есть две строки, одна типа String (обычная строка) переменная s, вторая типа WString (локализуемая строка) переменная w.

Есть 3 варианта:

  • userMods.ToWString( s) == w
  • common.CompareWString( userMods.ToWString( s ), w)
  • s == userMods.FromWString( w )

при userMods.FromWString и userMods.ToWString похоже еще надо делать проверку типа:

if common.IsWString( w ) then
return userMods.FromWString( w )
else
return w
end

Что целесообразней?

Также интересно, что быстрее пробежать циклом все элементы таблицы и найдя нужный вызвать return, или использовав string.find?

Ссылка на комментарий
Поделиться на другие сайты

Первый вариант у меня не работал. По крайней мере с русским текстом... Приходилось использовать третий.

Ссылка на комментарий
Поделиться на другие сайты

1-ый и не будет работать. WString - это userdata, их нельзя просто сравнивать.

Также интересно, что быстрее пробежать циклом все элементы таблицы и найдя нужный вызвать return, или использовав string.find?

string.find - это же, по-моему, поиск подстроки в строке. Как это поможет найти нужный элемент таблицы, не пробегая ее?

Ссылка на комментарий
Поделиться на другие сайты

имелось ввиду:

for key, value in avatarBuffs do
local buffInfo = object.GetBuffInfo( value )
local nam = userMods.FromWString(buffInfo.name)
if nam == "Стремление к тьме" then
return true
end
end

или

for key, value in avatarBuffs do
local buffInfo = object.GetBuffInfo( value )
local nam = userMods.FromWString(buffInfo.name)
local find = string.find(nam, "Стремление к тьме")
if find then
return true
end
end

равноценно по скорости?

Ссылка на комментарий
Поделиться на другие сайты

Вроде бы простой оператор сравнения быстрее.

Вариант 1:

local a, b = 0, 0
local str1, str2 = 'very-very long string', 'very-very long string'
while a < 1000000 do
a = a + 1;
if str1 == str2 then
b = b + 1;
end
end

Время выполнения ~ 0,046с

Вариант 2:

local a, b = 0, 0
local str1 = 'very-very long string'
while a < 1000000 do
a = a + 1;
if string.find( str1, 'very-very long string' ) then
b = b + 1;
end
end

Время выполнения ~ 0,685с

Ссылка на комментарий
Поделиться на другие сайты

Первый вариант не прокатит, как уже писалось, потому что WSTRING для Lua это юзердата, т.е. выглядит как ссылка на данные, а на две разные переменные, даже если их значения одинаковые, ссылки будут разные и не равны друг другу.

В АПИ есть функции:

FunctionCompareWStringEx -- --- function --- common.CompareWStringEx (сравнить две локализуемые строки без учёта регистра)

Но у меня есть стойкое подозрение что в случае если нам надо сравнить String и WString, то лучше перевести WString в String и сравнить, чем пользоваться любым другим вышеозвученным методом. Не исключено что функции CompareWStringEx преобразуют WString в String и уже над String'aми производят операции.

П.С. что-то движок форума вырезает текст из сообщения. Второй функцией является

common.CompareWString( text1, text2 )

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования