4

我想知道如何仅在某些条件下更改订购方向。在我的情况下,以“BB”开头的字符串应该按另一个方向排序,其他所有内容都应该像往常一样排序。

我的测试班:

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());
        }
    }

}

我的比较器:

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;
  }

}

我想要的输出:
AA
AB
BB9
BB7
BB3
CB3
CB4

到目前为止的实际结果:
AA AB
CB3
BB9
BB7
BB3
CB4

强尼

4

2 回答 2

6

您需要确保 Comparator 仅在两个元素都以“BB”开头时应用不同的排序。现在,即使您将“BB9”与“CB3”进行比较,您的 Comparator 也会应用不同的排序,因此后者在 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;
   }
}
于 2012-08-21T12:24:01.667 回答
1
if(someField.startsWith("BB") && o.someField.startsWith("BB")))

Try this change in your compareTo method which may solve your problem.

于 2012-08-21T12:26:45.403 回答