2015-07-16 2 views
0

Я написал метод, который сортирует массивList, и они обменивают последовательные элементы в этом массиве. Я столкнулся с проблемой -Требование HeapSpace в java - Arrays.sort() vs Collections.sort()

Если я реализую метод с помощью Collections.sort(), он дает ошибку heapsize, а если я использую Arrays.sort(), он не работает и успешно работает.

public ArrayList<Integer> sortAndSwap(ArrayList<Integer> a) { 
     Collections.sort(a); 
     for(int i = 0; i < a.size()-1; i+=2) { 
      int temp = a.get(i); 
      a.add(i, a.get(i+1)); 
      a.add(i+1, temp); 
     } 
     return a; 
    } 

этот метод дает ошибку ниже -

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3210) at java.util.Arrays.copyOf(Arrays.java:3181) at java.util.ArrayList.grow(ArrayList.java:261) at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235) at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227) at java.util.ArrayList.add(ArrayList.java:475) at Solution.wave(Solution.java:7) at Main.main(Main.java:322)

а если я изменить его следующим образом

public ArrayList<Integer> sortAndSwap(ArrayList<Integer> a) { 
     Integer []arr = new Integer[a.size()]; 
     a.toArray(arr); 
     Arrays.sort(arr); 
     for(int i = 0; i < a.size()-1; i+=2) { 
      int temp = arr[i]; 
      arr[i] = arr[i+1]; 
      arr[i+1] = temp; 
     } 
     a = new ArrayList<Integer>(Arrays.asList(arr)); 
     return a; 
    } 

Он работает отлично и дает желаемые результаты. Почему это происходит, может кто-нибудь объяснить? Благодаря !

ответ

6

Для операции свопинга вы вызываете add, когда вы должны использовать set. Итак, вы увеличиваете список бесконечно.

+0

Спасибо! это сработало. Еще одна вещь, если Arrays.sort() и Collections.sort() одинаково эффективны? –

+1

Collections.sort() основан на массиве Arrays.sort(), но добавляет накладные расходы на создание временного массива из списка. – wero

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