29

I've got one class, that I sort it already by one attribute. Now I need to make another thing, that I need to create another way to sort my data. How can I make it, so I can choose between the two methods. The only command I know is Collections.sort that will pick up the method compareTo from the class I want to compare its data.

Is it even possible?

jzd
  • 23,473
  • 9
  • 54
  • 76
Gondim
  • 3,038
  • 8
  • 44
  • 62
  • If it's possible to use more explicit words in place of "thing" and "way", then giving good answers will be easier. As it stands, I must respectfully admit I struggled to understand the exact question. – lance.dolan Mar 06 '18 at 18:53

3 Answers3

67

What you need to do is implement a custom Comparator. And then use:

Collections.sort(yourList, new CustomComparator<YourClass>());

Specifically, you could write: (This will create an Anonymous class that implements Comparator.)

Collections.sort(yourList, new Comparator<YourClass>(){
    public int compare(YourClass one, YourClass two) {
        // compare using whichever properties of ListType you need
    }
});

You could build these into your class if you like:

class YourClass {

    static Comparator<YourClass> getAttribute1Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 1
        };
    }

    static Comparator<YourClass> getAttribute2Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 2
        };
    }
}

It could be used like so:

Collections.sort(yourList, YourClass.getAttribute2Comparator());
jjnguy
  • 136,852
  • 53
  • 295
  • 323
3

You can only have one compareTo() method in your class.

If you want to sort the same class more than one way, create Comparator implementations.

jzd
  • 23,473
  • 9
  • 54
  • 76
3

If the two methods require the exact same footprint, you may be inappropriately overloading a single class with multiple uses, which would be resolved by fixing your class hierarchy - like instead of using "shape", subclass it with "oval", "rectangle", etc.

If subclassing doesn't make sense, you need to create different comparison classes. In Java, you often use a Comparator for comparisons. Create several (or create a configurable comparator): IsbnComparator, AuthorComparator, etc.

Oh, and the configurable option would be:

 BookComparator implements Comparator {
   enum FIELD { AUTHOR, ISBN, ... };
   setSortOrder(int rank, FIELD field){...}
 }
Joe Taras
  • 15,166
  • 7
  • 42
  • 55
atk
  • 9,244
  • 3
  • 32
  • 32