2013-10-04 5 views
0

Мой вход -Список Сортировать по Номер

List<String> parameterNames => [value0, type1, type0, name1, value1, name0] 

Я использую Collections.sort

Collections.sort(parameterNames) 

я получаю ответ, как этот

[name0, name1, type0, type1, value0, value1] 

Я хочу, чтобы сортировать и получить список например

[name0,type0,value0,name1,type1,value1] 

смогу ли я сделать это на Java?

+6

Да, вы сможете это сделать на Java. – SudoRahul

+0

Вы можете посмотреть это http://www.thejavageek.com/2013/06/17/sorting-user-defined-objects-part-2/ –

+0

Посмотрите http://stackoverflow.com/questions/11257531/Java-род-алгоритм-строка-с-номер – Ioan

ответ

8

Написать обычай Comparator, и передать его экземпляр в sort метода:

Comparator<String> myComparator = new Comparator<String>() { 
    public int compare(String str1, String str2) { 
     // get the number at the end, and compare on the basis of that number 
     // And then do the string comparison on substring before number 
    } 
}; 

Collections.sort(parameterNames, myComparator); 
0

При использовании Collections.sort(), вы можете передать Comparator реализовать специальный метод для проверки того, что это выше и что ниже в порядке поиска ,

0

Лучше использовать пользовательский интерфейс Comparator. Если вы столкнулись с проблемой использования Comparator, чем пытаться использовать следующий код:

List<String> revList= new ArrayList<>(); 
    List<String> parameterNames=..//[value0, type1, type0, name1, value1, name0] 
    for (String string : parameterNames) { 
     revList.add(new StringBuilder(string).reverse().toString());//reverse the word 
    } 
    Collections.sort(revList);// Sort reverse word. 

    for (String string : revList) { 
     System.out.println(new StringBuilder(string).reverse().toString()); 
     // Again reverse to get desired output. 
    } 

Выход: NAME0, type0, value0, name1, type1, VALUE1

0

Вы должны реализовать свой собственный Comparator с этой логикой ,

Предполагая, что все ваши ценности формата stringNUMBER, вот выстрел в реализации:

/** 
* Compares two {@link String}s of the format stringNUMBER. Assumption: There is a single numeric  part to the string, 
* always at the end. 
*/ 
public class TrailingNumberComparator implements Comparator<String> { 
    @Override 
    public int compare(String o1, String o2) { 
     int cmp = o1.substring(getStrartNumberIndex(o1)).compareTo(o2.substring(getStrartNumberIndex(o2))); 
     if (cmp != 0) { 
      return cmp; 
     } 
     return o1.compareTo(o2); 
    } 

    private static int getStrartNumberIndex(String s) { 
     for (int i = 0; i < s.length(); ++i) { 
      if (Character.isDigit(s.charAt(i))) { 
       return i; 
      } 
     } 
     return s.length(); 
    } 
} 

Вы тогда быть в состоянии назвать Collections.sort(parameterNames, new TrailingNumberComparator());

Смежные вопросы