问题
I need to keep the order of my list of objects as it can be changed and reordered anytime in my webapp.
In my model I have a array list of objects example
objectList = [object1, object2, object3, object4]
and I save the order of each object belonging to this instance to a Map example: order
{
"object1":4,
"object2":2,
"object3":1,
"object4":3
}
Therefore i want to sort my array according to its value in the map retrieved by the objects Id as the key:
Expected result:
[object3, object2, object4, object1]
How would I go about doing this?
回答1:
Assuming your objects have a getter for the id getId()
, then you can make use of the Comparator.comparing() helper method, which creates a comparator for the provided lambda:
objectList.sort(Comparator.comparing(o -> yourMap.get(o.getId()));
This effectively the same as writing your own Comparator
or writing your own compare method.
回答2:
Something that may look overkilling but it could be more natural to define a new class
class IndexedElement implments Comparable<Integer> {
private final int index;
private final YourObject element;
public IndexedElement(int index, YourObject element) {
this.index = index;
this.element = element;
}
@Override
public int compareTo(Integer o) {
return this.getIndex().compareTo(o.getIndex()) ;
}
}
storing objects like that in a TreeSet<IndexedElement>
you can automatically achieve the sorting and retrieving (TreeSet.ceiling(new IndexedElement(yourIndex, null)), just remember to Override the equals/hashCode in IndexedElement)
来源:https://stackoverflow.com/questions/61205215/how-to-sort-an-arraylist-using-a-map-key-as-list-object-and-value-as-the-order