/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

import java.util.Comparator;

class ComplexComparator implements Comparator<Book> {

    private Comparator<Book> comp;

    public ComplexComparator(Comparator<Book> x, Comparator<Book> y) {
        comp = x.thenComparing(y);
    }

    public ComplexComparator(Comparator<Book> x, boolean h, Comparator<Book> y, boolean i) {
        if (h && i) {
            comp = x.thenComparing(y);
        } else if (h) {
            comp = x.thenComparing(y.reversed());
        } else if (i) {
            comp = x.reversed().thenComparing(y);
        } else {
            comp = x.reversed().thenComparing(y.reversed());
        }
    }

    public static void main(String[] args) {
        Comparator<Book> page = Comparator.comparing(Book::getPageNb);
        Comparator<Book> title = Comparator.comparing(Book::getTitle);
        Comparator<Book> aver = Comparator.comparing(Book::getAverage);

        ComplexComparator c1 = new ComplexComparator(page, title);
        ComplexComparator c2 = new ComplexComparator(page, false, title, true);
        ComplexComparator c3 = new ComplexComparator(aver, false, title, true);

        Book b1 = new Book(5, "abc", 10);
        Book b2 = new Book(10, "abc", 10);
        System.out.println(c1.compare(b1, b2)); // -1, page only
        System.out.println(c2.compare(b1, b2)); //  1, page only reversed
        System.out.println(c3.compare(b1, b2)); //  0, same page&title
    }

    @Override
    public int compare(Book o1, Book o2) {
        return comp.compare(o1, o2);
    }
}

class Book {
    int pageNb;
    String title;
    int average;

    public Book(int pageNb, String title, int average) {
        this.pageNb = pageNb;
        this.title = title;
        this.average = average;
    }

    public int getPageNb() { return pageNb;  }
    public String getTitle() { return title;  }
    public int getAverage() { return average;  }
}