2013-05-09 3 views
-1

Я очень новичок в java, и я выполняю задание, где требуется использовать сортировку слияния, но я продолжаю получать ошибки. Мы используем ArrayList и заставляем меня совершать много ошибок. Я отправил код ниже, а также ошибку, которую я продолжаю получать, может ли кто-нибудь помочь мне разобраться, почему это происходит?Сообщение об ошибке получения слияния Java Merge

import java.util.ArrayList; 
import java.util.UUID; 

public class mSort { 

public static ArrayList<String> randomList() { 
    ArrayList<String> a = new ArrayList<String>(); 

    for(int i = 0; i < 10; i++) { 
     a.add(i, UUID.randomUUID().toString()); 
    } 

    return a; 
} 

public void sort(ArrayList<String> list) { 
    sortArray(0, list.size(), list); 
} 

private void sortArray(int low, int high, ArrayList<String> list) { 
    if ((high - low) >= 1) { 
     int middle1 = (low + high)/2; 
     int middle2 = middle1 + 1; 

     sortArray(low, middle1, list); 
     sortArray(middle2, high, list); 
     merge(low, middle1, middle2, high, list); 
    } 
} 

private void merge(int left, int middle1, int middle2, int right, ArrayList<String> list) { 
    int leftIndex = left; 
    int rightIndex = middle2; 
    int combinedIndex = left; 
    ArrayList<String> combined = new ArrayList<String>(); 
    ArrayList<String> data = list; 

    while (leftIndex <= middle1 && rightIndex <= right) { 
     if (data.get(leftIndex).compareTo(data.get(rightIndex)) < 0) { 
      combined.add(combinedIndex, data.get(leftIndex)); 
      combinedIndex++; 
      leftIndex++; 
     } 
     else { 
      combined.add(combinedIndex, data.get(rightIndex)); 
      combinedIndex++; 
      rightIndex++; 
     } 
    } 

    if (leftIndex == middle2) { 
     while (rightIndex <= right) { 
      combined.add(combinedIndex, data.get(rightIndex)); 
      combinedIndex++; 
      rightIndex++; 
     } 
    } 
    else { 
     while (leftIndex <= middle1) { 
      combined.add(combinedIndex, data.get(leftIndex)); 
      combinedIndex++; 
      leftIndex++; 
     } 
    } 
    for (int i = left; i <= right; i++) { 
     list.set(i, combined.get(i)); 
     //System.out.println(list.get(i)); 
    } 
} 

public static void main(String[] args) { 
    ArrayList<String> list = randomList(); 
    mSort sorted = new mSort(); 
    sorted.sort(list); 

    for (int i = 0; i < list.size(); i++) { 
     System.out.println(list.get(i)); 
    } 
} 

}

вот трассировки стека для ошибки:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 0 
at java.util.ArrayList.rangeCheckForAdd(Unknown Source) 
at java.util.ArrayList.add(Unknown Source) 
at mSort.merge(mSort.java:40) 
at mSort.sortArray(mSort.java:27) 
at mSort.sortArray(mSort.java:25) 
at mSort.sortArray(mSort.java:26) 
at mSort.sortArray(mSort.java:25) 
at mSort.sort(mSort.java:17) 
at mSort.main(mSort.java:74) 

ответ

1

Есть пара проблем.

  1. sortArray(0, list.size(), list); должен быть sortArray(0, list.size() - 1, list);, потому что индексы идут от 0 до размера - 1;

  2. Линии combined.add(combinedIndex, data.get(rightIndex)); в слиянии.
    Вы не можете добавить к индексу, который находится вне этого диапазона 0 <= index <= size. Когда вы это сделаете, вы должны выбросить IndexOutOfBoundsException в соответствии с documentation. (Что он делает). Именно по этой причине вы видите исключение. Размер комбинированного массива ArrayList равен 0, и вы пытаетесь вставить его в индекс 3.
    Вы можете изменить все эти строки только combined.add(data.get(...)); (удалите объединенныйиндекс). Переменная mixedIndex не требуется, так как массив уже должен быть частично отсортирован, поэтому добавление должно содержать его сортировку.

  3. Блок ниже в конце слияния alls должен быть изменен, чтобы вы не выходили за пределы размера() объединенного списка массивов. Показано ниже.

Перед

for (int i = left; i <= right; i++) { 
    list.set(i, combined.get(i)); 
} 

После

for (int i = left; i <= right; i++) { 
    list.set(i, combined.get(i - left)); 
} 
+0

Большое вам спасибо, что я получил его! – user1758231

1

Это происходит, так как индекс массива, что у вас есть больше, чем размер массива минус один. Индекс массива начинается с 0 и переходит в n-1

+0

Это не должно быть проблемой, потому что я добавляю индекс не устанавливая его, если я не недоразумение, что вы – user1758231

+0

Есть несколько ошибок. Поскольку Динофф и я упоминали, что это размер Кроме того, когда вы переходите к методу слияния, вам нужно поместить int mixedIndex = 0; в противном случае он начинается с индекса 5, а в комбинированном - нет. и в конце вам нужно сделать (i-left) снова, как сказал Dinoff –

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