2017-05-03 70 views
0

林有麻烦找出一种方法来排序某类号码我尝试头脑风暴的方式进行排序,但认为社会有一个答案已经数量在java中排序

什么我试着理清像数字:

  1. FA8Z-7406024-AB
  2. DS7Z-6632394-d
  3. AA8Z-6632394-S
  4. SR3Z-15342-H
  5. TR3 Z-72B39842-S
  6. TR3Z-7239842-S

的排序方法应该由中间先走,然后是第一个数字,然后最后的最后一个号码

如果我的列表进行排序以上,它应该是这样的:

  1. SR3Z-15342-H
  2. AA8Z-6632394-S
  3. DS7Z-6632394-S
  4. TR3Z-7239842-S
  5. TR3Z-72B39842-S
  6. FA8Z-7406024-AB

如果中间数中有一封信,信应该被忽略,但它应该后进行排序任何类似数字但没有字母的数字(IE TR3Z's)。

编辑:固定例子

+4

创建[比较](https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html)。 – Compass

+0

并发布代码后,如果您有问题,请指定它们。 – SomeDude

+1

请阅读[如何创建最小,完整和可验证的示例](http://stackoverflow.com/help/mcve) –

回答

0

假设所有的entried遵循相同的格式,这应该做,不同的是FA8Z-7406024-AB将在排序后的数组,第二元件由于基于中间值比较:

Comparator<String> comparator = (s1, s2) -> { 
    String[] tokens1 = s1.split("-"); 
    String[] tokens2 = s2.split("-"); 

    int number1 = Integer.parseInt(tokens1[1].replaceAll("[^0-9]", "")); 
    int number2 = Integer.parseInt(tokens2[1].replaceAll("[^0-9]", "")); 

    //Compare the numbers 
    if(number1 - number2 == 0 && tokens1[1].length() == tokens2[1].length()){ 
     //Compare the Strings 
     return tokens1[0].compareTo(tokens2[0]) == 0 ? tokens1[2].compareTo(tokens2[2]) : tokens1[0].compareTo(tokens2[0]); 
    }else if (tokens1[1].length() != tokens2[1].length()){ 
     return tokens1[1].length() - tokens2[1].length(); 
    }else{ 
     return number1 - number2; 
    } 
}; 

下面是一个例子:

List<String> list = Arrays.asList("FA8Z-7406024-AB", "DS7Z-66329294-D", "AA8Z-66329294-S", "SR3Z-15342-H", "TR3Z-72B381942-S", "TR3Z-72381942-S"); 

Collections.sort(list, comparator); 

System.out.println(list); 
+1

请提供足够的解释,不要鼓励回答不清楚的问题! – Yahya