-5

I have a class which contain called books which contains 3 variables.

String name;
int price;
int pages;

I need to sort these but cannot use the compare To interface on the book class. Is there a way to sort by name then price then pages?

CIsForCookies
  • 12,097
  • 11
  • 59
  • 124

2 Answers2

0
// create a class for comparing name  that implements the comparator interface     

class BooknameComparator implements Comparator{  
    public int compare(Object o1,Object o2){  
    Student s1=(Student)o1;  
    Student s2=(Student)o2;  

    return s1.name.compareTo(s2.name);    
    }  
    } 



// create a class for comparing price 

class PriceComparator implements Comparator{  
    public int compare(Object o1,Object o2){  
    Student s1=(Student)o1;  
    Student s2=(Student)o2;  

    if(s1.price==s2.price)  
return 0;  
else if(s1.price>s2.price)  
return 1;  
else  
return -1;  
}     

    } 

In your main class ,call the sort method as follows :

 // for comparison using name
    Collections.sort(al,new BooknameComparator ());  




 // for comaprison using price
    Collections.sort(al,new PriceComparator ());  

You can customise your sorting based on your needs and these classes

Vishesh
  • 308
  • 1
  • 9
0

The answer from Vishsh is the solution to your problem - you don't need to modify the Book class in order to create a comparator based on its fields. I 'll just show the Java 8 syntax for doing this (which is more concise).

Edit

This is how you would sort your books if they were contained in a list:

    Collections.sort(bookArray,Comparator.comparing(Book::getName));
    Collections.sort(bookArray,Comparator.comparing(Book::getPrice));
    Collections.sort(bookArray, Comparator.comparing(Book::getPages));

Now that you have an array, you can use:

Book[] sortedBookArray =  Arrays.stream(bookArray).sorted(Comparator.comparing(Book::getPrice)).sorted(Comparator.comparing(Book::getName)).sorted(Comparator.comparing(Book::getPrice)).toArray();
sestus
  • 1,875
  • 2
  • 16
  • 16