I'm in the process of figuring out a good way to combine data from several sources into a single activity stream, which means that they should be categorized by date and then sorted by time. While that's a piece of cake with a single view, it gets hairy when you have several views, or perhaps several different types of sources entirely. Fortunately, abstract data types are here to help.
You're already using
Maps, right? For this, I decided to use
Maps and one of my personal favorites, the
Set. If you're not familiar with them,
Sets are like
Lists, but only contain one of each element and don't (normally) guarantee any specific order -
DocumentCollections are a type of Set (albeit not actually implementing the interface).
I created the categories by using a
Map with the
Date as the key and
Sets of entries as the value. That would work well enough using
HashSets, but they would require manual sorting in the XPage to display them in the right order. Fortunately, Java includes some more-specific types for this purpose:
SortedSet. These are used the same way as normal
Sets, but automatically maintain an order (based on either your own
Comparator or the "natural" ordering based on the objects'
compareTo(...) methods). Better still, the specific
TreeSet implementation classes have methods to get at the keys and values, respectively, in descending order.
Once I had my collection objects picked out, all I had to do was start filling them in. I used stock
Date objects for the
Map's keys and wrote a
compareTo(...) method for the entries I'm keeping in the
Set. Then, on the containing activity stream class, I just had to write a "serializer" method to write out the current state of the objects into a
List for access.
While I may change around the way I do this (I may end up putting the category headers inline so I just use one
SortedSet for performance), it provides a pretty good example of when you can use some of Java's built-in classes to do some of the grunt work for you.