Is there a way to write custom comparator, following this example:
There are at most 10 items coming in at a random order i.e.
first item: item_one
second: second_one
third: third_one
I want result them to be sorted like : second_one
, third_one
, first_one
. I'd like to pull this order from configuration file, sort of like template for sorting.
Am I using the wrong data structure, does anyone have experience with this?
Internally the Sort method does call Compare method of the classes it is sorting. To compare two elements, it asks “Which is greater?” Compare method returns -1, 0, or 1 to say if it is less than, equal, or greater to the other. It uses this result to then determine if they should be swapped for their sort.
The Comparator and Comparable interface don't do any sorting, so there is no sorting algorithm there. They just compare two Objects, something you need if you want to sort a list of those objects.
The very idea of sorting (including the sort() method) implies the objects MUST be comparable - in this case, with either Comparable or Comparator . With the compareTo() method in the Circle class, Java now knows how to compare them and can sort them. Now you can do this: Collections.
Java Comparator interface is used to order the objects of a user-defined class. This interface is found in java. util package and contains 2 methods compare(Object obj1,Object obj2) and equals(Object element).
Sure. Here is an "OrderedComparator
" that compares elements according to a predefined order:
class OrderedComparator implements Comparator<String> {
List<String> predefinedOrder;
public OrderedComparator(String[] predefinedOrder) {
this.predefinedOrder = Arrays.asList(predefinedOrder);
}
@Override
public int compare(String o1, String o2) {
return predefinedOrder.indexOf(o1) - predefinedOrder.indexOf(o2);
}
}
And here is some test code. (I used a List
instead of a Set
since it 1) seem more natural when talking about the order of the elements and 2) better illustrate what happens with duplicate elements upon sorting using this comparator.)
class Test {
public static void main(String[] args) {
// Order (could be read from config file)
String[] order = { "lorem", "ipsum", "dolor", "sit" };
List<String> someList = new ArrayList<String>();
// Insert elements in random order.
someList.add("sit");
someList.add("ipsum");
someList.add("sit");
someList.add("lorem");
someList.add("dolor");
someList.add("lorem");
someList.add("ipsum");
someList.add("lorem");
System.out.println(someList);
Collections.sort(someList, new OrderedComparator(order));
System.out.println(someList);
}
}
Output:
[sit, ipsum, sit, lorem, dolor, lorem, ipsum, lorem]
[lorem, lorem, lorem, ipsum, ipsum, dolor, sit, sit]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With