I’ve been working all day and I somehow can’t get this probably easy task figured out – probably a lack of coffee…
I have a synchronizedList where some Objects are being stored. Those objects have a field which is something like an ID. These objects carry information about a user and his current state (simplified).
The point is, that I only want one object for each user. So when the state of this user changes, I’d like to remove the “old” entry and store a new one in the List.
protected static class Objects{
...
long time;
Object ID;
...
}
…
if (Objects.contains(ID)) {
Objects.remove(ID);
Objects.add(newObject);
} else {
Objects.add(newObject);
}
Obviously this is not the way to go but should illustrate what I’m looking for…
Maybe the data structure is not the best for this purpose but any help is welcome!
EDIT:
Added some information…
A Set does not really seem to fit my purpose. The Objects store some other fields besides the ID which change all the time. The purpose is, that the list will somehow represent the latest activities of a user. I only need to track the last state and only keep that object which describes this situation.
I think I will try out re-arranging my code with a Map and see if that works…
A Map is easiest, but a Set reflects your logic better. In that case I’d advice a Set.
There are 2 ways to use a set, depending on the equals and hashCode of your data object.
If YourObject already uses the ID object to determine equals (and hashCode obeys the contract) you can use any Set you want, a HashSet is probably best then.
If YourObjects business logic requires a different equals, taking into account multiple fields beside the ID field, then a custom comparator should be used. A TreeSet is a Set which can use such a Comparator.
An example:
EDIT
I have updated the code above to reflect that id is not an int, as suggested by the question.