2013-08-20 1 views
1

У меня есть этот двухмерный массив строк.целочисленная сортировка в массиве 2-й строки

2 10 BakerSarah D 
2 11 SmothersSally A 
2 12 SillySall C 
2 13 Viper B 
2 5 LouieChef B 
2 6 Lawson C 

Каждый столбец является строкой. Теперь я хочу сортировать это во втором столбце. я попробовал этот код

void sortarray(final int index){ 
     Arrays.sort(data, new Comparator<Object[]>(){ 
      @Override 
      public int compare(Object[] o1, Object[] o2) { 
       String[] a = (String[])o1; 
       String[] b = (String[])o1; 
       return a[index].compareTo(b[index]); 
      } 
     }); 

    } 

, но это дает вид в

2 10 BakerSarah D 
    2 11 SmothersSally A 
    2 12 SillySall C 
    2 13 Viper B 
    2 5 LouieChef B 
    2 6 Lawson C 

в порядке. Почему так ?? Как изменить, что для сортировки

2 5 LouieChef B 
2 6 Lawson C 
2 10 BakerSarah D 
2 11 SmothersSally A 
2 12 SillySall C 
2 13 Viper B 
+0

Вы хотите целочисленную сортировку, но ваше значение по-прежнему является строкой, вам нужно преобразовать ее в целое число и сравнить целые числа – x4rf41

ответ

1

Когда сравнивать возвращает 0 (т.е. они равны), то вам нужно сравнить на другой индекс. Я обновил ваш код, чтобы иметь этот новый индекс - index2.

void sortarray(final int index, final int index2){ 
    Arrays.sort(data, new Comparator<Object[]>(){ 
     @Override 
     public int compare(Object[] o1, Object[] o2) { 
      String[] a = (String[])o1; 
      String[] b = (String[])o1; 
      Integer i = a[index].compareTo(b[index]); 
      if (i == 0) { 
       return a[index2].compareTo(b[index2]); 
      } 
      return i; 
     } 
    }); 

} 

Я предполагаю (возможно, неправильно), что вы хотите отсортировать мой первый столбец, а затем второй. Если это всего лишь второе, попробуйте что-то, что @ x4rf41 говорит и делает Integer.valueOf, чтобы преобразовать строку в целое число

Лично я хотел бы создать объект и реализовать на нем Comparator, чтобы вы могли сортировать в более OO путь.

+1

, что такое index2 ?? – user2699538

+0

вам нужно преобразовать строку в целое число, тогда сортировка будет работать – x4rf41

+1

index2 - это второй индекс, который вы хотите отсортировать. В этом примере это столбец, содержащий 5,6,10, .... – RNJ

1

Строки имеют естественный лексикографический порядок. Это означает, что «10» доходит до «5». Целые числа имеют натуральный, числовой порядок. Таким образом, вы должны превратить ваши строки в числа и сравнить цифры:

Arrays.sort(data, new Comparator<Object[]>(){ 
    @Override 
    public int compare(Object[] o1, Object[] o2) { 
     String[] a = (String[])o1; 
     String[] b = (String[])o1; 
     if (index == 2) { // lexicographic order 
      return a[index].compareTo(b[index]); 
     } 
     else { // numeric order 
      int left = Integer.parseInt(a[index]); 
      int right = Integer.parseInt(b[index]); 
      return Integer.compare(left, right); 
     } 
    } 
}); 

Обратите внимание, что это не будет, если произойдет, вместо того, чтобы использовать String [], чтобы держать вашу информацию, вы использовали собственный класс, с полями соответствующий тип:

public class Row { // choose a better name 
    private int field1; // choose a better name 
    private int field1; // choose a better name 
    private String name; 

    // constructor and getters omitted 
} 

Java - это язык OO. Использовать объекты.

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