Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Поиск в многомерном массиве (http://www.flasher.ru/forum/showthread.php?t=211036)

PsychoTech 14.06.2015 19:32

Поиск в многомерном массиве
 
Пишу техническую программку для друга. Столкнулся с таким случаем. есть многомерный массив
Код AS3:

var mss:Array= new Array(new Array(0,1),new Array(1,2),new Array(2,3));

далее необходимо добавить в этот массив данные типа

Код AS3:

var mass2: Array= new Array(3,4);

но перед этим необходимо проверить нет ли уже подобных данных в массиве и если нет то тогда добавлять. Пробовал indexOf но он пропускает и данные добавляются.
Код AS3:

if (mss.indexOf(new Array(num1, num2)) < 0) {
                                                mss[mss.length] = new Array(num1, num2);// на счет этой конструкции не парьтесь просто у меня .push() - начал капризничать а так идет гладко, сохраняя логику всего приложения
                                        }else {
                                                trace('ошибка: уже есть');
                                        }

в общем нужно найти выход из сложившейся ситуации по проще чтобы не городить парсер, ну или если без него никак то дайте знать. Надеюсь задача ясна. чтобы отсечь неуместные ответы, подведу итог. Как проверить наличие в многомерном массиве

ZackMercury 14.06.2015 19:39

Наверное, только циклом.

PsychoTech 14.06.2015 19:45

этого я и боялся. а что если в моем случае только два параметра и обернуть их не в массив а в точку
Код AS3:

var mss:Array= new Array(new Point(0,1),new Point(1,2),new Point(2,3));

Код AS3:

if (mss.indexOf(new Point(num1, num2)) < 0) {
                                                mss[mss.length] = new Point(num1, num2);
                                        }else {
                                                trace('ошибка: уже есть');
                                        }

такая конструкция будет проверть не массив а точки и по идеи
Код AS3:

new  Point(1,0) === new  Point(1,0)

или нет?

ZackMercury 14.06.2015 19:53

Насколько мне известно - экземпляры классов проверяются по ссылкам, поэтому new Point(1, 0) != new Point(1, 0) - true;

А вот String, int, Number примитивы проверяются по содержанию, да.

PsychoTech 14.06.2015 19:54

сам спросил -> сам отвечаю. Не идет. Неужели только через цикл проверять?

ZackMercury 14.06.2015 20:00

Ну, это не должно вас пугать, indexOf в недрах тоже циклом проходится по элементам и сравнивает с каждым, только делает это чуть быстрее штатных средств AS3.

samana 14.06.2015 20:14

Если у вас массив с точками, то найти одинаковую точку в таком массиве не сложно
Код AS3:

public function Main() 
{
        //добавили точки в массив
        arr.push(new Point(0,1));
        arr.push(new Point(1,2));
        arr.push(new Point(3,4));
 
        //попытаться добавить новую точку, если нет похожей
        trace(addIfNotSame(arr, new Point(1,1)));
 
}
 
public function addIfNotSame(array:Array, point:Point):Boolean
{
 
        for (var i:int = 0; i < array.length; i++)
        {
                //.. если хоть одна точка такая же, как и та, что хотим добавить,
                //то прекращаем поиск и выходим из метода
                if ((array[i] as Point).equals(point)) return false;
        }
 
        //если одинаковых точек не нашлось, то добавляем точку в массив
        array.push(point);
 
        return true;
}


PsychoTech 14.06.2015 20:21

Цитата:

Сообщение от samana (Сообщение 1183594)

Код AS3:

public function addIfNotSame(array:Array, point:Point):Boolean


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

udaaff 14.06.2015 21:21

Создать двумерный массив и записывать туда какая ячейка занята не подойдет?

PsychoTech 14.06.2015 22:20

Цитата:

Сообщение от udaaff (Сообщение 1183598)
Создать двумерный массив и записывать туда какая ячейка занята не подойдет?

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


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

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