codewario
codewario

Reputation: 21418

Are there "tagged" collections in Java?

Are there "tagged" collections in Java? To clarify, I want to essentially classify each element in the list with some sort of Object (e.g. a String) so I can reference different objects in the list by a tag that I specify, not by Object type or element contents.

EDIT: A HashMap will not work as the order of the items in the list is also deemed to be important. My understanding is that a HashMap is not practical when the order of the list matters in some way. If I am incorrect on this matter, by all means please correct me.

Upvotes: 1

Views: 445

Answers (10)

Andrew Lazarus
Andrew Lazarus

Reputation: 19330

See SortedMap and TreeMap.

Upvotes: 1

TofuBeer
TofuBeer

Reputation: 61526

If order is important then use a LinkedHashMap.

Upvotes: 1

Guillaume
Guillaume

Reputation: 22822

This is not detailed enough. We don't know if: - multiple tags per item are allowed - multiple items per tag are allowed

I'm going to go for the widest solution, where both of these are true. First thing you need is your Tag class (I suggest an enum)

public enum Tag {
    TAG1, TAG2, TAG3; // add your tags here
}

Then your collection will be a Map where the key is your object, and the value your list of tags for each object.

Map<Object, List<Tag>> items = new HashMap<Object, List<Tag>>();

Of course, you can replace "Tag" with a String, if you want to allow any tag and not just known tags.

And depending what you want to do with your collection, you may want to reverse it:

Map<Tag, List<Object>> = new HashMap<Tag, List<Object>>();

I suggest first writing your test cases (unit-tests) listing your specifications, and the design of your collection will appear organically from them (TDD).

Upvotes: 1

Ed Staub
Ed Staub

Reputation: 15690

If you're not restricted to what's in the JDK, consider use of Guava Multimaps. They provide pre-built support for a map of sets.

Upvotes: 2

FloppyDisk
FloppyDisk

Reputation: 1703

You could use a map

Map<String, Object> = new HashMap<String, Object>(); 

You can replace String with whatever you want. The one problem you might run into though, is if you want to categorize multiple objects with the same "tag". For instance, a "Cat" tag might apply to multiple, unique cat objects and a hashMap would only let you have one Cat object pointed to by the "Cat" tag. If that's what you want to do (multiple objects pointed to by one tag), you will need to declare the map as:

Map<String, List<Object>> = new HashMap<String, List<Object>>(); 

That will create a HashMap holding a list for each object so you can have multiple objects pointed to by one tag.

Upvotes: 2

jmg
jmg

Reputation: 7414

No, as far as I know there are no "tagged" collections in the standard Java libraries. But you could use a Map<Tag,Set<String>> to tag strings.

Upvotes: 3

Dogmatixed
Dogmatixed

Reputation: 794

if each key in a Map maps to a Set of objects, you'll be able to easily look up every object with a particular tag(key)

Upvotes: 3

mre
mre

Reputation: 44240

You're looking for a Map. This data structure maps keys to values.

Upvotes: 3

NimChimpsky
NimChimpsky

Reputation: 47290

sounds like you want a hashmap

Upvotes: 0

unixorn
unixorn

Reputation: 201

Perhaps a Map is what you need

Upvotes: 1

Related Questions