Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   String в роли массива.. (http://www.flasher.ru/forum/showthread.php?t=86496)

SiDDD 16.10.2006 22:35

String в роли массива..
 
Вложений: 1
Вот такая ещё беда у меня :rolleyes: Так как с массивами пошло не очень - хотелось бы знать реально ли использовать на ролях массива обычный String? С чтением из оного всё шло просто на ура! Из любой точки, в любое время - всегда пожалуйста (string.charAt(nn) или substr работают исправно). Но как дело дошло до записи всё снова усложнилось...

Для простоты на данном примере (Вложение 15495) пытаюсь изменить только 4-й символ на "x":

Код:

var s1:String="0123456789";
var s2:String;

_root.onEnterFrame=function(){
       
        s2=s1;
       
        s2.charAt(3)="x";        // Выдает ошибку - т.к. только для чтения
        s2[3]="x";                // Автоматически  создается массив - тоже не то
        s2(3)="x";                // Эххх мечты-мечты - не работает
       
        s2=s1.substring(0,3) + "x" + s1.substring(4,10); // Работает исправно, но усложняет код

        txt1.text=s1;
        txt2.text=s2;
};

Вопрос вот в чем - как наиболее просто изменить в String'е один или цепочку символов? Есть такой вариант или в моём примере предложен самый простой???

wvxvw 16.10.2006 22:59

Ну... можно еще так:
Код:

var str1:String = "1234567";
var str2:String = "";
str2 = str1.split(str1.charAt(3)).join("x");

Ну не на много лучше канеш, но все, что пришло в голову...
Это, конечно, если сиволы не повторяются =)

iNils 16.10.2006 23:05

Цитата:

Сообщение от SiDDD
Так как с массивами пошло не очень - хотелось бы знать реально ли использовать на ролях массива обычный String?

Я так и не понял, а какой смысл перехода с массива на строки? В том, что массивы не копируются легко? Ну пока ни кто от этого не умер.

SiDDD 16.10.2006 23:44

Ув. iNils - дело было так:

Начиналось с массивов. Пока необходимости в их клонировании небыло - всё было ок. Втож время, как вариант, попробовал String - для чтения просто чудо! К примеру, как по вашему лучше:

Код:

var myArray:Array=(new Array("1","2","x","@","t","i","8"),
if(myArray[y][x]=="A" && myArray[y][x+1]=="B" && myArray[y][x+2]=="C")...

или

Код:

var sMap:String=""12x@ti8";
if(myString.substr(X,3)=="ABC")...

А если массив состоит из нескольких тысяч символов??? :eek: Кавычки сниццо будут потом ещё неделю :D И что самое приятное - String таки копируется а не "раздает" указатели на себя. Вобщем я в раздумьях... А что работает быстрее - String или Array???

iNils 16.10.2006 23:54

1. Проблема с набиванием решается так:
Код:

//// набили так
str = "1234567";
//// сделали массив
arrayA = str.split ("");

2. Почему вы в массивах с двухмерными работаете массивах, а со строками - одномерными? Тогда вы без for одним concat легко обойдетесь. Даже елс ии массив многомерный, что страшного в цикле?
3. Со стороками лишаетесь ряда методов, таких как сортировка.
4. Указатели может и плохо, но часто это и хорошо.

Я бы на вашем месте не изобретал бог знает что, а работал с массивами. И потом какой суммарной размерности у вас массив? 10'000, 100'000?

SiDDD 17.10.2006 00:20

1. Как вариант вот подумалось: Оригинал (в прошлом а1) хранить как строку а массив а2 получать из str.split ("") ...хотя оригинал то всё равно менять нужно. Хех.;
2. Одномерные/двумерные - это был только пример придуманный на ходу (не приводить же весь исходник!) На деле все многомерное. String конечно один но условно поделен на строки шириной Wdth - координату получал как Y*Wdth+X.
3. Сказать по правде - массив играет роль карты. Зачем сортировать карту? :rolleyes:
4. Не спорю.

зы. А как быть с возможностью изменения сразу нескольких ячеек? (Arr[1][1]="1"; Arr[1][2]="2"; Arr[1][3]="3"; ...и т.д.) Для строки это казалось прощще...но только казалось :D

Sy_2007 30.11.2007 00:42

А могу я туда вставить не "uaaaaaaa" а (0...255)?

wvxvw 30.11.2007 14:01

Код:

String.prototype.__resolve = function(p){
        if(!isNaN(p)){
                return this.charAt(p);
        }
}
var a:String = "abcdefghjklmo";
trace(a[3]);

:D
Единственное, что нужно понимать, что возвращенное значение будет не ссылкой на символ строки, а новой строкой, так что
Код:

a[3] = "z";
Не изменит изначальную строку

ЗЫ. Почему-то такая кончтрукция (попытка создать геттер\сеттеры не увенчалась успехом %) Но чего-то думать, как бы это обойти не хочется %)
Код:

String.prototype.__resolve = function(p){
        if(!isNaN(p) && p<this.length){
                this.___prop = "."+this.charAt(p);
                this.gfunc = function(){
                        return this.___prop.charAt(1);
                }
                this.sfunc = function(_p){
                        this.split(this.___prop.charAt(1)).join(_p);
                }
                this.addProperty(this.charAt(p), this.gfunc, this.sfunc);
                return this.gfunc();
        }
}
var a:String = "abcdefghjklmo";
trace(a[3]);
a[3] = "z";
trace(a);

Так тоже не получилось =)
Код:

String.prototype.__resolve = function(p){
        if(!isNaN(p) && p<this.length){
                this.___prop = "."+this.charAt(p);
                this.gfunc = function(){
                        return this.charAt(p);
                }
                this.sfunc = function(_p){
                        this.split(this.___prop.charAt(1)).join(_p);
                }
                this.addProperty(this.___prop, this.gfunc, this.sfunc);
                if(this[this.___prop] == undefined) this[this.___prop] = this.charAt(p);
                return this[this.___prop];
        }
}
var a:String = "abcdefghjklmo";
trace(a[3]);
trace(a["___prop"]);
trace(a[".d"]);
a[3] = "z";
trace(a);


B0Bka 01.12.2007 03:49

разводить демогогию не буду но скажу что когда юзал обработку около 2000 xml файлов через DOM с массивами, память нещадно утекала, когда перешел на SAX и данные в памяти хранил в строках жить стало проще жить стало веселее, но это выбирается конкретно для каждой задачи
(прежде чем перейти с массивов пришлось перестроить структуру xml файлов чтобы оптимизировать поиск совпадений по ним)
если бы это была прога на с++ или даже на java я бы не когда не занялся таким извращением.
так что SiDDD ты не один такой ;)

RegExp рулит


Часовой пояс GMT +4, время: 11:40.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.