How to create 2 depends Comparators in java?

Lets say I have a Product class in Java and 2 Comparators:

  1. 1st is price Comparator for asc order.
  2. 2nd is price Comparator for desc order.

It can be that if I changed the 1st to be product name Comparator, so, the 2nd will change automatic to name Comparator as well?

Thanks alot!

Exmaple:

class ProductComparatorByPriceDesc implements Comparator<Customer> {
        @Override
        public int compare(Product o1, Product o2) {
             return o1.getPrice() - o2.getPrice();
        }
    }

Class ProductComparatorByPriceAsc implements Comparator<Customer> {
    @Override
    public int compare(Customer o1, Customer o2) {
        return o2.getPrice() - o1.getPrice();
    }
}

So if i changed the 1st comparator to sort by name, not price, the 2nd will changed as well, but not the opposite!

Jon Skeet
people
quotationmark

I would suggest only having a single comparator class for comparing by price, and a separate comparator class to compare by name (or no classes - see the end of my answer). Each class does one thing, and does it well.

Then you can reverse any comparator using the Comparator.reversed default method... and likewise you can chain them together using Comparator.thenComparing, should you wish to order by name and then price, for example:

Comparator<Product> nameThenPrice =
    new NameComparator().thenComparing(new PriceComparator());

(If you're not using Java 8, it's easy enough to write a ReversingComparator which takes an existing one, and a CompoundComparator which takes two existing ones.)

You can also use Java 8's static methods in Comparator:

Comparator<Product> byName = Comparator.comparing(p -> p.getName());
Comparator<Product> byPrice = Comparator.comparing(p -> p.getPrice());
Comparator<Product> nameThenPrice = byName.thenComparing(byPrice);

That way you often don't need to implement Comparator at all manually.

people

See more on this question at Stackoverflow