Sunday, May 1, 2011

Number of items stored in Bucket list

I was wondering how to get the number of items stored in a TBucketList. As far as I can see there is only the number of buckets and the bucket array available, so all I can think of is

Count := 0;
for I := 0 to BucketList.BucketCount - 1 do
  Inc (Count, BucketList.Buckets [I].Count);

That does work but it seems odd to me, that I have to iterate through all buckets to find the number of items stored - something that is probably needed very often.

Am I missing another possibility? Or is there a reason why this container class does not provide a Count member like the other containers?

Thanks!

From stackoverflow
  • Libraries are never complete. But you can extend them.

    If you need this value often, you can write a class helper for that.

    TBucketListHelper = class helper for TBucketList
      function GetCount: Integer;
    end;
    
    function TBucketListHelper.GetCount: Integer;
    var
      i : Integer;
    begin
      Result := 0;
      for I := 0 to BucketCount - 1 do
        Inc (Result, Buckets [I].Count);
    end;
    

    You now can use:

    BucketList.GetCount
    

    If TBucketListHelper is within scope.

    Smasher : That's exactly what I did. I don't use TBucketList directly but derived my own class from it anyway. I was just wondering if there is another possiblity or any reason why this wasn't implemented. If I call something like HashTable.Count I don't expect it to iterate over perhaps thousands of buckets...
  • There is no other solution without having to keep a counter in sync with the content.
    It's basically a collection of collections.

  • Since you are using your own derived class then just increment and decrement a counter on Add and Remove. You could include the loop method as a double check just in case.

0 comments:

Post a Comment

Note: Only a member of this blog may post a comment.