2014-09-19 3 views
1

Мне нужно отсортировать набор строк, который содержит число. Ex: [15, 13, 14, 11, 12, 3, 2, 1, 10, 7, 6, 5, 4, 9, 8]. Мне нужно отсортировать его до [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]. Но когда я использую Collections.sort(keyList);, где keyList установлен, полученный мною результат равен [1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9]. Пожалуйста помоги.Сортировка набора номеров строк в java

+2

Сравнение строк является алфавитным. Попробуйте преобразовать его в список Integer, чтобы получить желаемый результат. – blackSmith

+0

Пожалуйста, разместите фактический код, который вы использовали. – wei2912

+2

Collections.sort принимает компаратор в качестве аргумента. Это позволяет вам самостоятельно определить функцию сравнения. (Фактически, измените на int, а затем сравните значения) – Ronald

ответ

0

вы можете попробовать:

final int[] searchList = 
     new int[] { 15, 13, 14, 11, 12, 3, 2, 1, 10, 7, 6, 5, 4, 9, 8 }; 
Arrays.sort(searchList); 

Результат:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 

Список должен быть int

2

Написать собственный компаратор и разобрать его в качестве аргумента Collections.sort(Collection,Comparator). Одно из решений - разбор ваших строк на целые.

Collections.sort(keyList, new Comparator<String>() 
    { 
     @Override 
     public int compare(String s1, String s2) 
     { 
      Integer val1 = Integer.parseInt(s1); 
      Integer val2 = Integer.parseInt(s2); 
      return val1.compareTo(val2); 
     } 
    }); 
+4

Пожалуйста, используйте generics. Прошло 10 лет с момента их появления ... – Natix

+0

Упс! Forgott: / – kai

0

Преобразуйте String сек в Integer с первым.

List<Integer> ints = new ArrayList<>(); 
for (String s : strings) 
    ints.add(Integer.parseInt(s)); 
Collections.sort(ints); 

Если вам не нужны дублирующиеся значения, вы можете использовать SortedSet, которая поддерживает порядок автоматически:

SortedSet<Integer> ints = new TreeSet<>(); 
for (String s : strings) 
    ints.add(Integer.parseInt(s)); 
// all done! 
0

Ваши строки будут отсортированы как строки в естественном порядке, а не как числа. Итак, "11" приходит после "10" и "2" придет после "11111111110".

Что делать ?.

Используйте Integer.parseInt(), чтобы проанализировать каждое значение строки в наборе как целое число, затем добавить их в набор и вызвать Collections.sort().

0

вы могли бы сделать, как сказал Кай, и преобразовать строку в целое и сравнить его

но это дорогостоящая операция, то, что я предлагаю это:

keyList.sort(new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      if (o1.length() == o2.length()){ 
       return o1.compareTo(o2); 
      } 
      return o1.length() - o2.length(); 
     } 
    }); 

если ваши номера имеют одинаковую длину, тогда сопоставьте их, используя String.compareTo, в противном случае отсортируйте их по заказу, чтобы 1 2 3 будет автоматически до 11 22 и т.д.

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