Reputation: 5568
I am fairly new to Java and now I have to create some Comparator classes.
On this Stackoverflow page I have found some really useful information about using lambda expressions. How to compare objects by multiple fields
Which made me thing about creating a Compartor class like this:
public class WidthComparator implements Comparator{
@Override
public int compare(Object t, Object t1) {
Foto foto1 = (Foto)t;
Foto foto2 = (Foto)t1;
return Comparator.comparing(Foto::getWidth)
.thenComparing(Foto::getHeight)
.thenComparingInt(Foto::getName);
}
}
}
so when I have a collection called fotosCollection, I would like to be able to do this:
fotosCollection.sort(new HoogteComparator());
This obviously does not work, but how could I get this to work?
Ps. I have to use a Comparator class.
Upvotes: 4
Views: 794
Reputation: 2789
If you really don't want the comparator type to be anonymous for some reason, you can do:
public class WidthComparator implements Comparator<Foto>{
private final static Comparator<Foto> FOTO_COMPARATOR = Comparator.comparing(Foto::getWidth)
.thenComparing(Foto::getHeight)
.thenComparingInt(Foto::getName);
@Override
public int compare(Foto foto1, Foto foto2) {
return FOTO_COMPARATOR.compare(foto1, foto2);
}
}
I also would consider avoiding the use of the rawtype and implement Comparator<Foto>
instead, as I did above.
Upvotes: 2
Reputation: 311163
Comparator.comapring
returns a Comparator
- you can just use it directly:
// Define a "constant" comparator
private static final Comparator<Foo> HOOGTE_COMPARATOR =
Comparator.comparing(Foto::getWidth)
.thenComparing(Foto::getHeight)
.thenComparingInt(Foto::getName);
// Use it elsewhere in your code
fotosCollection.sort(HOOGTE_COMPARATOR);
Upvotes: 5
Reputation: 753
You can try this old-style approach:
public class WidthComparator implements Comparator{
@Override
public int compare(Object t, Object t1) {
Foto foto1 = (Foto)t;
Foto foto2 = (Foto)t1;
// width asc order
if(foto1.getWidth() != foto2.getWidth())
return foto1.getWidth() - foto2.getWidth();
// height asc order
if(foto1.getHeight() != foto2.getHeight())
return foto1.getHeight() - foto2.getHeight();
// name asc order
return foto1.getName().compareTo(foto2.getName());
}
}
Upvotes: 1