2014-09-04 5 views
1

Я был в тупике от этого какое-то время. У меня есть массив строк, все из которых содержат некоторое числовое значение, которое мне нужно извлечь и использовать для сравнения, чтобы отсортировать массив. Я попытался использовать встроенный метод сортировки с компаратором, но не смог с ним справиться.Сортировка массива строк по значению в строке

Если кто-нибудь может дать мне немного проницательности или указать мне в правильном направлении, что было бы весьма полезно.

Массив содержит строки в формате: «NAME работал х часов»

Мое намерение состоит, чтобы вытащить из числа и сортировки на основе от значения целого числа в то же время сохраняя связь с именем.

public static <T> void sort(T[] a, Comparator<? super T> c) 
+1

Вы можете разместить массив строки? и результат, который вы хотите, чтобы он был –

+0

Есть тонны ответов на реализацию «естественной сортировки» на всех языках ... –

+1

Возможный дубликат [Сравнение строк упорядочения порядка сортировки в Java - один встроенный?] (http: // stackoverflow.com/questions/1262239/natural-sort-order-string-comparison-in-java-is-one-built-in) –

ответ

2

Вы можете использовать Collections.sort для сортировки строк с помощью comparator и разборе String к Integer, чтобы вы могли сортировать его целым числом.

образец:

String s[] = { "10", "2", "1" }; 
    Collections.sort(Arrays.asList(s), new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      int i = Integer.parseInt(o1); 
      int i2 = Integer.parseInt(o2); 
      if (i > i2) 
       return 1; 
      else if (i < i2) 
       return -1; 
      else 
       return 0; 
     } 
    }); 
    System.out.println(Arrays.toString(s)); 

результат:

[1, 2, 10] 
+0

* Массив содержит строки в формате: «NAME работал х часов» * - Итак, ему нужно немного изменить свою логику 'compare()' (на основе отредактированного вопроса). Но более или менее это правильный ответ. +1. – TheLostMind

0

если каждая строка содержит только цифры, то вы можете просто использовать ParseInt, чтобы получить целые значения для каждой строки, а затем отсортировать их используя обычный компаратор. Если строки содержат нечисловые символы и целые числа, это усложняет ситуацию, и вы можете захотеть сделать вспомогательный метод для выполнения грязной работы для вас. Возможная (хотя неэффективный) реализация может выглядеть ...

public static int getNumbersFromString(String string) 
{ 
    String numbers = ""; 
    for(int i = 0; i < string.length; i++) 
    { 
     if((int)(string.charAt(i) >= 48 && (int)(string.charAt(i) <= 57) 
      numbers += string.charAt(i); 
    } 
    int foo = Integer.parseInt(numbers); 
    return foo; 
} 
2

Убедитесь, что вы обрабатывать все крайние случаи, но ниже код должен работать для вас.

public class NumericStringComparator implements Comparator<String> { 
    @Override 
    public int compare(String str1, String str2) { 
     Integer num1 = extractNumericValue(str1); 
     Integer num2 = extractNumericValue(str2); 

     // handle null/error cases 

     return num1.compareTo(num2); 
    } 

    private static Integer extractNumericValue(String str) { 
     // extract numeric value however but as an example 
     return Integer.parseInt(str); 
    } 
} 

С помощью этого компаратора вы можете использовать метод Arrays.sort(..), чтобы отсортировать список

String[] array = ...; 
Arrays.sort(array, new NumericStringComparator()); 
+3

Лучший из многих ответов ИМХО. Кстати, если 'extractNumericValue()' возвратил 'I nteger', вся сравнительная часть сжимается до 'extractValue (str1) .compareTo (extractValue (str2))' –

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