Отправляет email-рассылки с помощью сервиса Sendsay

Screen reader JAWS for Windows Russian

[JFWRus] Замена символов

Здравствуйте, участники дискуссий.
Вопрос на красный пояс по джоз-джитсу:
Есть ли более элегантный, чем использование StringSegment, способ замены символа
в строке?
Например, в строке
"xxx:xxx:xxx"
надо заменить символ ":" на чсимвол "|".
Как решить эту задачу наименьшим количеством
строк кода?
С уважением, Анатолий.

***
Это сообщение No3601
было разослано для 304 участников дискуссионного листа
[JFWRus] Замена символов

Ответить   "i_chay" Sat, 15 Apr 2006 21:24:07 +0500 (#538176)

 

Ответы:

Здравствуйте,

Функция SubString спасёт отца русской демократии. Я предлагаю так:
var
string oldstring,
string newstring,
string temp,
int i

let oldstring="XXX:XXX:XXX"
let i=1
while (i<StringLength(oldstring))
let temp=SubString(oldstring,i,1)
if(temp==":") then
let newstring=newstring+"|"
else
let newstring=newstring+temp
Endif
let i=i+1
endwhile
Здесь возможны какие-то мелкие ошибки, но общая идея я думаю ясна. Будьте
внимательны с функцией substring, третий параметр в ней число символов, а не
номер последнего символа. Это может ввести в заблуждение.

До свидания.

***
Это сообщение No3604
было разослано для 304 участников дискуссионного листа
[JFWRus] Re: Замена символов

Ответить   Fri, 14 Apr 2006 21:33:43 -0700 (#538192)

 

Здравствуйте, Сергей.
Вы пишите:

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

Поэтому переформулирую все по-другому...
В скриптах джоза можно произвести замену символов в строке двумя способами:
1. Последовательный перебор символов (см. решение Туманяна).
2. С использованием StringSegment (см. пример после подписи).
Какие могут быть еще варианты?
С уважением, Анатолий.

; Замена символов при помощи StringSegment
...
var

string old_str,

string new_str,

string temp,

int i

let old_str = "xxx:xxxx:xx"+":\a"

let temp = ""

let i = 1

while (temp !="\a")

let temp = StringSegment (old_str, ":", i)

let new_str = new_str + temp + "|"

let i = i+1

endwhile

let new_str = StringLeft (new_str,

StringLength(new_str) -3)

...

***
Это сообщение No3606
было разослано для 304 участников дискуссионного листа
[JFWRus] Re[2]: Замена символов

Ответить   "i_chay" Sun, 16 Apr 2006 09:15:32 +0500 (#538266)

 

Привет, Анатолий!

Вы писали 16 апреля 2006 г., 7:15:32:

1. Воспользоваться функцией из внешнего сервера OLE Automation.
2. Функцией StringContains , например:
Script test ()
var
string old_str,
string new_str,
int i

let old_str = "xxx:xxxx:xx"+":\a"
let i = StringContains (old_str, ":")
while i > 0

let new_str = new_str + StringLeft (old_str, i-1) +"|"
let old_str = stringChopLeft (old_str, i)
let i = StringContains (old_str, ":")
EndWhile
let new_str = new_str + old_str

EndScript

Ответить   Sun, 16 Apr 2006 14:50:38 +0300 (#538353)

 

Здравствуйте, Олег.
Вы пишите:

А есть ли работающие примеры?
Честно сказать, тут два дополнительных вопроса:
1. Где бы найти такой Ole Automation, чтобы он загрузился быстрее, чем отработает
скрипт джоза, выполняющий такую замену?
2. Как в джозе дождаться результатов работы Ole Automation ?
По этому я и спрашиваю о примерах -- может быть, у вас уже есть ответы.

Согласен.
С уважением, Анатолий.

***
Это сообщение No3614
было разослано для 304 участников дискуссионного листа
[JFWRus] Re[4]: Замена символов

Ответить   "i_chay" Sun, 16 Apr 2006 19:08:00 +0500 (#538393)

 

Привет, Анатолий!

Вы писали 16 апреля 2006 г., 17:08:00:

Думаю сложно, скорее всего если самому написать InProcServer, только с одмим
методом replace, то ито будет медленнее. Если есть желание и время напиши такой
сервер на СИ, а потом сравни скорость работы четырёх способов. А если его написать
на Assembler, то был бы действительно чистый эксперемент.
А если запустить внешний сервер, например, Эксель, то понятно, что будет намного
медленее.
Есть недостаток у OLE Automation скорость их работы, особенно внешних не внутри
процессорных).

Вроде бы я с такой проблемой не сталкивался. Все работало нормально.
Но можно так:
var
object OExcel
let OExcel = CreateObject("Excel.application")
While not OExcel
pause (1)
EndWhile
Еще вставить дополнительное условие выхода из цикла, чтобы избежать бесконечного
цикла при отсутствии такого сервера.
Пишу без проверки вручную, могут быть опечатки.

Примеров, нет, но, это однозначно работает, я это раньше проверял.
Если начать писать, это надо посидеть, а на это надо потратить время. А по памяти
не помню.

Ответить   Sun, 16 Apr 2006 18:58:17 +0300 (#538421)

 

Здравствуйте,

Всегда пожалуйста.

Такой запрет в принципе не возможен, поскольку внутри себя функция
StringSegment всё равно их перебирает или сначала до конца или с конца в
начало. Какая разница перебирать ли их внутри функции или в скрипте? Можно
слегка подправить скрипт для перебора с конца в начало, если это поможет.
Вообще, наверно было бы проще огласить задачу целиком, а не её маленький
кусочек, тогда можно было бы понять природу Ваших ограничений и возможно
решить её вообще иначе, обойдя эти ограничения вокруг или в принципе не
сталкиваясь с ними.

Теоретически возможно было бы решить эту задачу путём бинарного дерева, но в
таком контексте это настолько неэффективно и в конце концов всё равно
приводит к последовательному перебору, только с гигантским оверхэдом. Вобщем
тормозить будет ужасно, хуже трактора "Беларусь".

Если вводить дополнительное условие о том, что разделители могут быть только
в строго определённых позициях в строке, то возможно решение без перебора и
с использованием той же функции SubString, но я так полагаю - это вряд ли
Вас устроит.

До свидания.

***
Это сообщение No3609
было разослано для 304 участников дискуссионного листа
[JFWRus] Re[3]: Замена символов

Ответить   Sat, 15 Apr 2006 16:01:27 -0700 (#538356)

 

Здравствуйте, Сергей.

Задача как раз в составлении списка возможных универсальных решений. Поэтому
пришлось ввести ограничение на перебор, чтобы
активизировать процесс.
В итоге три варианта: последовательный перебор, StringSegment и StringContains/StringLeft
от Олега Кутищева.
Может, кто-нибудь предложит что-нибудь еще?
С уважением, Анатолий.

***
Это сообщение No3612
было разослано для 304 участников дискуссионного листа
[JFWRus] Re[4]: Замена символов

Ответить   "i_chay" Sun, 16 Apr 2006 18:56:36 +0500 (#538388)

 

Здравствуйте,

Да пожалуйста ещё влёт решение через рекурсию.
string function Replace(string param)
var
string temp

let temp=substring(param,1,1)
if temp == ":" then
temp="|"
return(temp+replace(Substring(param,2,stringlength(param)-1)))
endfunction
Также возможны мелкие ошибки, но идея я думаю ясна. Рекурсия с
использованием двоичного дерева.
string Function Replace(string param)
var
string temp1,
string temp2

let temp1=substring(param,1,stringlength(param)/2)
if temp1==":" then
let temp1="|"
elif stringcontains(temp1,":") then
let temp1=Replace(temp1)
endif
let temp2=substring(param,stringlength(param)/2+1,stringlength(param)/2)
if temp2==":" then
let temp2="|"
elif stringcontains(temp2,":") then
let temp2=Replace(temp2)
endif
return temp1+temp2
endfunction
Этот способ также может содержать мелкие ошибки, просто написаны две этих
рекурсивных функции были в течение пятнадцати минут только для обозначения
идеи и совершенно не отлаживались, даже не компилировались, так что не
обессудьте. Но я думаю, что для примера идеи вполне подойдут. Честно говоря
писать итерационную функцию с использованием бинарного дерева меня просто
сломало, но это тоже возможно.

"Гусары, молчать!" (c) анекдот про порутчика Ржевского, я сам знаю, что
рекурсивные функции тормозные, просто это ещё один способ для коллекции.

До свидания.

***
Это сообщение No3617
было разослано для 304 участников дискуссионного листа
[JFWRus] Re[5]: Замена символов

Ответить   Sat, 15 Apr 2006 21:09:37 -0700 (#538429)