2013-10-25 4 views
1

Как я могу отсортировать массив массива ArrayList из целочисленного массива на основе последнего целого числа в массиве integer?Сортировка массива массивов целочисленных массивов

ArrayList<int[]> paths = new ArrayList<int[]>(); 
paths.add(new int[]{0,0,0,0,4}); 
paths.add(new int[]{0,0,0,0,2}); 
paths.add(new int[]{0,0,0,0,1}); 
paths.add(new int[]{0,0,0,0,3}); 

полученный ArrayList будет содержать: [0,0,0,1] [0,0,0,2] [0,0,0,3] [0,0,0,4]

ответ

5

Внесите a Comparator и используйте Collections.sort. Или оба сразу:

Collections.sort(paths, new Comparator<int[]>() { 
    public int compare(int[] a, int[] b) { 
     return (Integer)(a[a.length-1]).compareTo(b[b.length-1]); 
    } 
}); 
+0

Я получаю это: Невозможно вызвать compareTo (int) для примитивного типа int –

+0

Обновлен ответ. – Zong

+0

Попробуйте либо возвратить [a.length-1] -b [b.length-1]; 'или' return Integer.valueOf (a [a.length-1]). CompareTo (Integer.valueOf (b [b .length-1])); ' –

2

Вот версия с компаратором, который не делает Autoboxing или литье:

public class Sorter { 

    public static void main(String[] args) { 
     ArrayList<int[]> paths = new ArrayList<int[]>(); 
     paths.add(new int[] { 0, 0, 0, 0, 4 }); 
     paths.add(new int[] { 0, 0, 0, 0, 2 }); 
     paths.add(new int[] { 0, 0, 0, 0, 1 }); 
     paths.add(new int[] { 0, 0, 0, 0, 3 }); 
     Collections.sort(paths, new Comparator<int[]>() { 
      private static final int INDEX = 4; 
      @Override 
      public int compare(int[] o1, int[] o2) { 
       return Integer.compare(o1[INDEX], o2[INDEX]); 
      } 
     }); 
     for (int[] is : paths) { 
      System.out.println(Arrays.toString(is)); 
     } 
    } 
} 

будет приводить:

[0, 0, 0, 0, 1] 
[0, 0, 0, 0, 2] 
[0, 0, 0, 0, 3] 
[0, 0, 0, 0, 4] 
0

Прежде всего в вашем коде должно быть paths.add(...) не path.add(...)

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

public ArrayList<int[]> sort() { 
    ArrayList<int[]> sortedArray = this; 
    boolean switched = true; 
    while(switched) { 
     switched = false; 
     for(int i=0; i<sortedArray.size()-1; i++) 
      int[] a = sortedArray.get(i); 
      int[] b = sortedArray.get(i+1); 
      if(a[a.length]>b[b.length]) { 
       sortedArray.set(i, b); 
       sortedArray.set(i+1, a); 
       switched = true; 
      } 
    } 
    return sortedArray; 
} 

Это идет через ArrayList и проверяет, если последний элемент из каждой пары последовательных массивов находится в правильном порядке. Если это так, он проверяет следующую пару; если нет, то он переключает два массива int в ArrayList. Он продолжает проходить через ArrayList, пока ему не придется больше переключаться; на данный момент ArrayList сортируется.

+0

' ArrayList sortedArray = this' - что вы ожидаете от этого? – arshajii

+0

Вы предлагаете мне сделать это методом пустоты? – asaini007

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