AS3: Проверьте, пуст ли словарь

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

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

13.10.2009 03:31:49
5 ОТВЕТОВ
РЕШЕНИЕ

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

var count:int = 0;

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

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

6
13.10.2009 03:42:14

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

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]все должно быть в порядке).

12
14.10.2009 00:54:40
Это похоже на решение для плохой практики. Удаление записи из словаря должно удалить и ключ, и значение. Если по какой-то причине я хочу удалить значение, но оставить ключ, тогда dict не является действительно пустым - в нем есть некоторые (очевидно значимые) ключи.
Dan Homerick 14.10.2009 17:32:39
Справедливо. Если вы удалите оператор (obj! = Null), то это сработает, но я предполагаю, что другой ответ тоже сработает ...
Reuben 14.10.2009 20:27:18
На самом деле, не лучше ли объединить вышеописанный подход, который использует для ... с этим? Подход for ... in сообщает вам, есть ли у вас какие-либо ключи, что важно. Этот подход может потерпеть неудачу, если у вас есть ключ с нулевым значением.
scriptocalypse 19.04.2011 19:28:34

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

1
19.04.2011 19:17:18

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

var empty:Boolean = true;

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

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

2
9.09.2011 14:41:06

Проверено и работает.
Ясность улучшена, избегая отрицательного выражения.

/**
 * @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;
}
0
30.05.2015 08:21:53