对列表中的不同类型字符串进行排序

Sorting different type Strings in List

我有一个包含 AA0 AA5 BB2 BB9 AA1 BB13 AA7 AA2 的字符串列表,顺序不对。我想要的是两个单独的类别,如 AA0 AA1 AA2 AA5 AA7 BB2 BB9 BB13 我该怎么做?

我试过 myList.stream().sorted(mySorter).foreach(...); 其中 mySorter 如下所示:

  private final Comparator<String> mySorter= ( o1, o2 ) -> {
  try
  {
     final int first = Integer.parseInt( o1.substring( 2, o1.length() ) );
     final int second = Integer.parseInt( o2.substring( 2, o2.length() ) );
     System.out.println( o1 + " -> " + first + " " + o2 + " -> " + second );
     if ( o1.contains( "AA" ) && o2.contains( "BB" ) )
     {
        return -1;
     }
     else if ( o1.contains( "AA" ) && o2.contains( "AA" ) )
     {
        return first - second;

     }
     else if ( o1.contains( "BB" ) && o2.contains( "BB" ) )
     {
        return first - second;
     }
     return first - second;

  }
  catch ( final Exception e )
  {
     e.printStackTrace();
     return 0;
  }
  };

我知道它确实包含不必要的 if/else 块,但我同时有 java.lang.IllegalArgumentException: Comparison method violates its general contract!,我不知道为什么。一直在尝试解决异常,算法可以做我想做的事。任何帮助表示赞赏。谢谢。

任何比较器都必须遵循以下规则:

  1. 如果 A<B(例如,a.compareTo(b) return 是一个负数),则 B>A 必须为真(例如,如果您要调用 b.compareTo(a),它必须 return一个正数)。
  2. A=Aa.compareTo(a) 必须 return 0)。
  3. 如果 A<BB<C 那么这必须成立:A<C.

该错误表示您没有这样做。

您好像在声明所有 AA 类别都在所有 BB 类别之前(通过 ( o1.contains( "AA" ) && o2.contains( "BB" ) ) 行,但您没有添加相反的内容,即所有 BB 都在所有 AA 之后。您必须写成对使用,否则将无法正常工作。解决这个问题。也许还有更多违规行为,但是,一次一个步骤。

这里是一个示例,用于解决给定 string 列表的排序问题,其格式为前两个字符代表字符串,其余字符构成整数。

public static void main (String[] args)
{
  List<String>list = Arrays.asList("AA0", "AA5", "BB9", "BB2", "AA1", "BB13", "AA7", "AA2");

  Collections.sort(list,new Comparator<String>(){
     @Override
     public int compare(String o1,String o2) {
         String substr1 = o1.substring(0,2);
         String substr2 = o2.substring(0,2);
         Integer num1 = Integer.parseInt(o1.substring(2));
         Integer num2 = Integer.parseInt(o2.substring(2));

         int strCompare = substr1.compareTo(substr2); 
         int intCompare = num1.compareTo(num2);

         if (strCompare == 0)  return (intCompare == 0 ? strCompare : intCompare); 
         else return strCompare; 
       }
   });

   for (int i = 0; i < list.size(); ++i) {
        System.out.println(list.get(i));
   }
}