Форум 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=176418)

PlutDem 10.03.2012 01:23

Уникальные идентификаторы для объектов
 
Здравствуйте, мне нужно каждому создаваемому объекту присвоить уникальный идентификатор, который больше не встречается у других объектов. Решил, что лучше всего будет присваивать новому объекту идентификатор больший на 1, чем идентификатор предыдущего созданного объекта. Скажем, если у нас создано 10 объектов и десятый имеет идентификатор 10, то одиннадцатый будет иметь идентификатор 11 и т.д. Проблема в том, что если мы после этого удалим пятый объект и создадим новый, то его идентификатор будет равен 12, а хотелось бы что бы было 5 (после удаления объекта его идентификатор освобождается и его может занять другой объект) Подскажите, пожалуйста, как вообще можно все это организовать?

Gaen 10.03.2012 01:34

А для чего нужны айдишники?

Если вам необходимо к каждому объекту привязать какие-то данные, то с этой задачей как нельзя лучше справится класс Dictionary. С его помощью можно вообще обойтись без айдишников и использовать ссылку на объект как ключ для доступа к данным:

Код AS3:

var dict:Dictionary = new Dictionary();
 
var o:Object = {foo: "bar"};
 
dict[o] = "This is my data";
 
trace(dict[o]); //This is my data


ChuwY 10.03.2012 01:49

А вы используйте пул объектов, чтобы вообще не нужно было удалять объекты и освобождать идентификаторы.
А как вы вообще раздаете айдишники?
Если вам способ, предложенный товарищем Gaen не нравится, то можно сделать как-то так:


Код AS3:

class MyObject{
  // static
  private static const FREE_INDEXES : Vector.<uint> = new Vector.<uint>();
  private static var _numObjects : uint = 0;
  //
  private var _index : uint;
  public function MyObject(){
    if(FREE_INDEXES.length){
      _index = FREE_INDEXES.pop();
    } else {
      _index = _numObjects;
    }
    _numObjects++;
  }
 
  public function destructor():void{
    FREE_INDEXES.push(_index);
    _numObjects--;
  }
}


PlutDem 10.03.2012 01:51

Цитата:

Сообщение от Gaen (Сообщение 1068095)
А для чего нужны айдишники?

Нечто вроде серийного номера. Скажем, если есть куча роботов, то нужно их различать: "ROB- 123","ROB- 124" и т.п. Идентификатор, будет отображаться, так что эфемерная ссылка не выход:(

Wolsh 10.03.2012 02:18

Если точно по описанию задачи, то просто создайте массив с номерами удаляемых, и при создании нового сначала берите номер из этого массива, и только если он пуст - следующий из "большого" ряда. При удалении объекта соответственно кидайте его номер в массив удаленных, в запасник.

Wolsh 10.03.2012 02:23

Ну я не 10 секунд писал сообщение.

Добавлено через 4 минуты
ChuwY, а зачем увеличивать _numObjects когда номер взят из запасника?

Wolsh 10.03.2012 02:33

Не ну если просто чтоб _numObjects несла еще и справочный функционал "сколько вообще объектов" то пусть живет)))

PlutDem 10.03.2012 02:42

Еще можно отсортировать массив объектов по идентификаторам и пройтись по нему этим циклом:
Код AS3:

for (i:int=0; objects.length < i; i++) {
        if (objects[i].id != i)
        // создаем объект с идентификатором == i
}

Если ничего не найдется, то новый идентификатор будет равен objects.length++. Хотя метод Wolsh выглядит самым простым и быстрым.

ChuwY 10.03.2012 03:27

Цитата:

Сообщение от Wolsh (Сообщение 1068109)
ChuwY, а зачем увеличивать _numObjects когда номер взят из запасника?

Цитата:

Сообщение от Wolsh (Сообщение 1068109)
Не ну если просто чтоб _numObjects несла еще и справочный функционал "сколько вообще объектов" то пусть живет)))

Потому что называется numObjects, что я со своим полуотсутствующим знанием английского перевожу, как "количество объектов". То есть текущее. А если его не изменять в конструкторе\деструкторе, то свойство будет показывать максимальное количество созданных объектов и должно будет называться соответствующе. Ну maxNumCreatedObjects что ли.
Так что свойство просто следует своему названию, что гуд.

А еще все именно так, потому что я уже засыпаю и не успел подумать о экономии на этом инкременте\декременте.

PlutDem 12.03.2012 02:39

А если так?
Код AS3:

for (var i:int; i < objects.length;  i++){
    if (objects[i] == undefined)
        objects[i] = new Object(id = i);
}

Если элемент в массиве не занят, то добавляем объект туда и присваиваем ему идентификатор равный номеру элемента массива. Если свободных элементов нет, то добавляем в конец массива новый элемент и помещаем объект туда.


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

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