4 Stimmen

Umsortieren von String unter bestimmten Bedingungen

Ich fragte mich, wie ich die Sortierrichtung nur unter bestimmten Bedingungen ändern könnte. In meinem Fall sollten Strings, die mit 'BB' beginnen, in die andere Richtung sortiert werden, alles andere sollte wie gewohnt sortiert werden.

Meine Testklasse:

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 list = new ArrayList();
        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());
        }
    }

}

Mein Vergleichsklasse:

public class SomeClass implements Comparable
{
  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;
  }

}

Mein gewünschtes Ergebnis:
AA
AB
BB9
BB7
BB3
CB3
CB4

Das bisherige Ergebnis:
AA
AB
CB3
BB9
BB7
BB3
CB4

Jonny

6voto

Stephan Punkte 7232

Sie müssen sicherstellen, dass Ihr Comparator die unterschiedliche Sortierung nur anwendet, wenn beide Elemente mit "BB" beginnen. Derzeit wendet Ihr Comparator die unterschiedliche Sortierung an, auch wenn Sie "BB9" mit "CB3" vergleichen, und daher wird letzteres vor BB9 sortiert.

public class SomeClass implements Comparable
{
   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;
   }
}

1voto

sundar Punkte 1750
if(someField.startsWith("BB") && o.someField.startsWith("BB")))

Versuchen Sie diese Änderung in Ihrer compareTo Methode, die Ihr Problem lösen könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X