Sorting strings differently on some conditionals

I wondered how I can change the direction of the order only on some conditional. In my case, Lines starting with "BB" should be ordered in the other direction, everything else should be ordered, as usual.

My test class:

public class StringTest { public static void main(String[] args) { SomeClass someClass1= new SomeClass("AA"); SomeClass someClass2= new SomeClass("AB"); SomeClass someClass3= new SomeClass("CB4"); SomeClass someClass4= new SomeClass("BB7"); SomeClass someClass5= new SomeClass("BB9"); SomeClass someClass6= new SomeClass("BB3"); SomeClass someClass7= new SomeClass("CB3"); List<SomeClass> list = new ArrayList<SomeClass>(); list.add(someClass1); list.add(someClass2); list.add(someClass3); list.add(someClass4); list.add(someClass5); list.add(someClass6); list.add(someClass7); Collections.sort(list); for (SomeClass someClass : list) { System.out.println(someClass.getSomeField()); } } } 

My comparator:

 public class SomeClass implements Comparable<SomeClass> { private String someField; public int compareTo(final SomeClass o) { int res = 0; if (someField.startsWith("BB")) { res = o.someField.compareTo(someField); } else { res = someField.compareTo(o.someField); } return res; } } 

My desired result:
AA
Ab
BB9
BB7
BB3
CB3
CB4

Actual result:
A.A. Ab
CB3
BB9
BB7
BB3
CB4

Johnny

+4
source share
2 answers

You need to make sure that your comparator applies different sorting only when both elements begin with "BB". Your comparator is applying different sorting right now, even if you are comparing “BB9” with “CB3” and therefore the latter is sorted before BB9.

 public class SomeClass implements Comparable<SomeClass> { private String someField; public int compareTo(final SomeClass o) { int res = 0; if (someField.startsWith("BB") && o.someField.startsWith("BB")) { res = o.someField.compareTo(someField); } else { res = someField.compareTo(o.someField); } return res; } } 
+6
source
 if(someField.startsWith("BB") && o.someField.startsWith("BB"))) 

Try this change in the compareTo method, which can solve your problem.

+1
source

All Articles