AS3: проверьте, пуст ли словарь - PullRequest
10 голосов
/ 13 октября 2009

Flash реализует словарь (то есть что-то вроде HashMap), используя два подхода. Один подход - класс flash.utils.Dictionary, а другой - универсальный Object. Я хотел бы проверить, сколько key:value пар в словаре. В большинстве случаев я просто хотел бы знать, что есть любые key:value пары, то есть просто проверьте, пусто ли оно.

Документация не сильно помогла в этом вопросе. Есть ли простой и понятный способ сделать это? Если это не так, есть ли уродливый, но не слишком хрупкий способ сделать это?

Ответы [ 5 ]

12 голосов
/ 13 октября 2009

Это достоверно скажет вам, если конкретный словарь пуст:

function isEmptyDictionary(dict:Dictionary):Boolean
{
    for each(var obj:Object in dict)
    {
        if(obj != null)
        {
           return false
        }
    }
    return true;
 }

Обратите внимание, что вам нужно выполнить проверку obj != null - даже если вы установите myDictionary[key] = null, он все равно будет повторяться как нулевой объект, поэтому обычный цикл for...in не будет работать в этом случае. (Если вы всегда используете delete myDictionary[key], все будет в порядке).

6 голосов
/ 13 октября 2009

Единственный способ, который приходит на ум, - это перебирать все ключи и считать их - вот так:

var count:int = 0;

for (var key:Object in dict)
{
   count++;
}

Довольно отстойно - но я думаю, что это то, что у тебя осталось. Обратите внимание, что Dictionary - это действительно очень тонкая оболочка для ванильного объекта.

2 голосов
/ 09 сентября 2011

И пустой / не пустой особый случай, упомянутый ОП:

var empty:Boolean = true;

for (var key:Object in dict)
{
   empty = false;
   break;
}

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

1 голос
/ 19 апреля 2011

Другой подход заключается в добавлении словарной записи dict ["count"], которая выполняет итерацию вверх каждый раз, когда вы добавляете элемент в словарь, и итерацию вниз каждый раз, когда вы удаляете элемент. Или более изощренное решение будет разделять словарь на подклассы и добавлять свойства push, pop и length, которые в основном делают то же самое.

0 голосов
/ 30 мая 2015

Проверено и работает.
Ясность улучшена благодаря избеганию негативных высказываний.

/**
 * @return  Whether given Dictionary has content or is empty.
 */
public function hasContent(dictionary:Dictionary):Boolean
{
    for (var anything:Object in dictionary)
        return true;
    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...