Associative array and ranges
Steven Schveighoffer
schveiguy at yahoo.com
Thu Feb 3 07:59:27 PST 2011
On Thu, 03 Feb 2011 10:41:16 -0500, Nrgyzer <nrgyzer at gmail.com> wrote:
> == Auszug aus Steven Schveighoffer (schveiguy at yahoo.com)'s Artikel
>> On Thu, 03 Feb 2011 09:35:44 -0500, Nrgyzer <nrgyzer at gmail.com>
> wrote:
>> > == Auszug aus bearophile (bearophileHUGS at lycos.com)'s Artikel
>> >> Nrgyzer:
>> >> > Is there any chance to cast/convert this array to an indexed
>> > array or
>> >> > is it possible to iterate over specific indices? I know that
>> > there is
>> >> > something like next() for the foreach-statement but when the
> array
>> >> > contains some thousand instances and I only want iterate over
> (for
>> >> > example) 5 elements I think that's the wrong way.
>> >> Show a hypothetical code example of what you desire to do,
> please.
>> >> Bye,
>> >> bearophile
>> >
>> > Example:
>> >
>> > ...
>> > class Example(T : Drawable) : Drawable {
>> >
>> > T[hash_t] pObjectsToDraw;
>> >
>> > uint pFrom, pTo;
>> >
>> > void setLimit(from, to) {
>> > pFrom = from;
>> > pTo = to;
>> > }
>> >
>> > void remove(T objToRemove) {
>> > pObjectsToDraw.remove(objToRemove.toHash());
>> > }
>> >
>> > override void draw() {
>> > for (uint i = pFrom; i < pTo; i++) {
>> > pOjectsToDraw[i].draw(); // cannot call
>> > because pObjectsToDraw is an associative and no static or dynamic
>> > array
>> > }
>> > }
>> >
>> > }
>> First, hashes are not stored in any particular order, so I'm not
> sure what
>> you expect to accomplish except "give me (pTo - pFrom) random
> elements
>> from the array"
>> Second, you can use a foreach loop to get data out of an AA, and
> then
>> break when you've retrieved enough elements.
>> Again, I'm not sure what the point is of starting in the middle of
> the
>> array. Are you expecting something different from a hashtable?
>> -Steve
>
> I know that hashes aren't stored in any order... but lets take the
> LinkedHashSet in Java. The LinkedHashSet/Map stores the hashes in
> order of inserting. With the toArray()-method I can loop over
> specific elements/indices... but I can also remove the elements by
> their hash. I'm looking for a similar technique in D - you can find
> an Java example on http://www.java2s.com/Code/JavaAPI/java.util/
> LinkedHashSettoArray.htm.
The AA does not do that. Note that there is no builtin 'set' type in D
(there is one in dcollections).
Note that your worry about performance when iterating the AA is completely
negated by the toArray call -- this allocates space for your temporary
array, and necessarily iterates all elements, even if you only want 5.
You are better off not to do things this way.
Incidentally, I do plan on adding a Link*Set/Map to dcollections, because
I really like the array type in php (same thing). But this will not
provide constant access to the nth element, so it still will fail your
requirements.
The only thing I can think of is to store the elements in an array
alongside the hash map (do you need to look up elements by hash_t? If
not, why not just use an array directly?) to store the order of
insertion. This only works if you rarely remove elements (removal in an
array is an O(n) operation).
-Steve
More information about the Digitalmars-d-learn
mailing list