确定集合中的所有项目是否符合既定标准

时间:2015-04-02 19:50:23

标签: algorithm

这似乎是一个很大的问题。我几乎每次都会提出相同的解决方案,但如果人们有更好的方法来实现这一点,那就很好奇。

我有一个类是另一个类的实例列表。父类的状态取决于所有子项的状态

举个例子。说我有以下课程

class Box
{
    int _objectId= <insert_unique_id>;
    int _itemCount = 0;

    public void AddItem()
    {
       _itemCount = Max(_itemCount + 1, 5);
    }

    public int GetId()
    { 
       return _objectId;
    }

    public bool IsFull()
    {
         return _itemCount == 5
    }
}

class BiggerBox
{
     Map<int, Box> _boxes;

     public void AddToBox(int id)
     {
        _boxes[id].AddItem();
     }

     public bool IsFull()
     {
         foreach(var box in _boxes.Values)
            if(!box.IsFull())
               return false;
         return true;
     } 
}

“Box”的所有添加都是通过BiggerBox.AddToBox调用完成的。我想要做的是能够确定box.IsFull(),而不是每次添加元素时都迭代每个项目。

通常我通过保留SET或单独收集哪些项目已满而完成此任务。

好奇,有没有人能够找到一个巧妙的解决方案,或者是没有其他办法的简单答案?

2 个答案:

答案 0 :(得分:2)

为了达到你想要的目的,你需要做两件事:

  1. 能够控制集合的每个入口点
  2. 对集合中对象的更改做出反应
  3. 例如,如果集合中的对象是可变的(意味着,它们可以在添加到集合后更改),则需要主对象对该更改做出反应。

    正如您所说,您可以创建一组单独的已满的对象,但如果对象之后可以更改,则当它们发生更改时,您需要将它们从该集中取出,或者将它们添加到该集合中。

    这意味着为了优化这一点,您需要一些方法来观察底层对象的更改,例如,如果它们实现INotifyPropertyChanged或类似的。

    如果对象在添加到主对象后无法更改,或者您并不关心它们是否存在,则只需要控制每个入口点,这意味着您基本上需要将必要的检查添加到{{1方法。


    对于您的特定类型,我会在AddItem类上实现一个事件,以便在它满时触发事件。然后,您的Box类将挂钩此事件,以便观察基础框何时变满。

答案 1 :(得分:1)

您可以维护BiggerBox类中完整(或非完整)框的数量,并在所有函数中更新它。

,例如,AddToBox可能是:

bool wasFull = _boxes[id].IsFull;
_boxes[id].AddItem();
if (!wasFull && _boxes[id].IsFull) // After this update box has become full.
    completeBoxes += 1;

也可以在其他假设函数中实现此维护程序(例如RemoveFromBoxAddBoxRemoveBox等。