2015-11-11 9 views
0

Я работаю над проектом для школы, и все идет хорошо, пока я не попытался выполнить сортировку слияния на моем ArrayList.
Он будет работать, но затем он выйдет из строя. Первая ошибка многих - Exception in thread "main" java.lang.StackOverflowError. Я просмотрел код и не могу узнать, почему происходит ошибка. Это дает мне место (line 74:first_half = mergeSort(first_half);), но я не вижу проблемы.Merge sort java.lang.StackOverflowError

public static void main(String[] args) throws IOException { 

    // URL url = new 
    // URL("https://www.cs.uoregon.edu/Classes/15F/cis212/assignments/phonebook.txt"); 
    FileReader fileReader = new FileReader("TestSort.txt"); 
    BufferedReader bufferReader = new BufferedReader(fileReader); 
    String entry = bufferReader.readLine(); 

    // Scanner s = new Scanner(url.openStream()); 

//  int count = 0; 

    while (entry != null) { 

     // String person = s.nextLine(); 
     String phoneNum = entry.substring(0, 7); 
     String name = entry.substring(9); 
     PhonebookEntry newentry = new PhonebookEntry(name, phoneNum); 
     phoneBook.add(newentry); 
     entry = bufferReader.readLine(); 
    } 
    // ********************Selection 
    // Sort************************************* 
    ArrayList<PhonebookEntry> sortList = new ArrayList<PhonebookEntry>(phoneBook); 

    for (int min = 0; min < sortList.size(); min++) { 

     for (int i = min; i < sortList.size(); i++) { 
      int res = sortList.get(min).getName().compareTo(sortList.get(i).getName()); 

      if (res > 0) { 
       PhonebookEntry temp = sortList.get(i); 
       sortList.set(i, sortList.get(min)); 
       sortList.set(min, temp); 

      } 

     } 

    } 
    for (PhonebookEntry sortentry : sortList) { 
     System.out.println(sortentry); 
    } 


    System.out.println(mergeSort(mergeSortList)); 

} 


// *****************************merge sort****************************************** 
static int mergecounter = 0; 
static ArrayList<PhonebookEntry> mergeSortList = new ArrayList<PhonebookEntry>(appMain.phoneBook); 

public static ArrayList<PhonebookEntry> mergeSort(ArrayList<PhonebookEntry> mergeSortLists) { 
    if (mergeSortLists.size() == 1) { 
     return mergeSortLists; 
    } 
    int firstHalf = mergeSortLists.size() % 2 == 0 ? mergeSortLists.size()/2 : mergeSortLists.size()/2 + 1; 

    ArrayList<PhonebookEntry> first_half = new ArrayList<PhonebookEntry>(mergeSortLists.subList(0, firstHalf)); 
    ArrayList<PhonebookEntry> mergeSortHalf2 = new ArrayList<PhonebookEntry>(
    mergeSortLists.subList(first_half.size(), mergeSortLists.size())); 

    System.out.println(++mergecounter); 

    first_half = mergeSort(first_half); 
    mergeSortHalf2 = mergeSort(mergeSortHalf2); 
    return merge(first_half, mergeSortHalf2); 
} 

public static ArrayList<PhonebookEntry> merge(ArrayList<PhonebookEntry> first_half, 
     ArrayList<PhonebookEntry> mergeSortHalf2) { 
    ArrayList<PhonebookEntry> returnMerge = new ArrayList<PhonebookEntry>(); 

    while (first_half.size() > 0 && mergeSortHalf2.size() > 0) { 
     if (first_half.get(0).getName().compareTo(mergeSortHalf2.get(0).getName()) > 0) { 
      returnMerge.add(mergeSortHalf2.get(0)); 
      mergeSortHalf2.remove(0); 
     } 

     else { 
      returnMerge.add(first_half.get(0)); 
      first_half.remove(first_half.get(0)); 
     } 
    } 

    while (first_half.size() > 0) { 
     returnMerge.add(first_half.get(0)); 
     first_half.remove(first_half.get(0)); 

    } 
    while (mergeSortHalf2.size() > 0) { 
     returnMerge.add(mergeSortHalf2.get(0)); 
     mergeSortHalf2.remove(mergeSortHalf2.get(0)); 
    } 
    return returnMerge; 
} 

} 

ответ

0

Мое мнение в коде отсутствует.
Как это так?

Я запустил код в своей среде и выполнил его без ошибок.

С текстовый файл я нашел в https://www.cs.uoregon.edu/Classes/15F/cis212/assignments/phonebook.txt качестве входных данных и сделали простую реализацию для PhonebookEntry

Тогда почему эта ошибка?

Прежде всего, попытайтесь понять ошибку, я имею в виду, почему возникают StackOverflowError. Поскольку есть много, я не собираюсь объяснять это Но, пожалуйста, прочитайте главный ответ этого двух потоков, и я уверен, что вы узнаете, почему это происходит.

Thread 1: What is a StackOverflowError?
Thread 2: What actually causes a Stack Overflow error?

Если вы читаете те, я надеюсь, вы понимаете summury является You Ran Out Of Memory.

Тогда почему я не получил эту ошибку: Возможная причина в

В моей среде я настроил JVM для запуска с более высокой 1024M памяти до 1556m (в качестве параметра затмения)

Теперь позволяет анализировать случай с решение:

  1. вход: у вас есть большой вход здесь (50000)

    чтобы проверить вам код попытаться сократить ввод и тестирование.

  2. Вы выполнили два алгоритма в методе sigle над этим большим входом: Когда метод выполняет все свои переменные, остается в памяти до завершения его выполнения. поэтому, когда вы вызываете сортировку слияния, все предыдущие пользовательские вайрабли и другие остаются в памяти, которые могут способствовать этой ситуации.

    Теперь, если вы используете выделенный метод и вызываете их из основного метода, например, напишите метод сортировки сортировки, все его используемая разновидность выходит за рамки и может быть бесплатной (если GC собирает их) после завершения сортировки.

    Так напишите два разделенных метода для чтения входного файла и выбора сортировки. И Пожалуйста,close() те FileReader и BufferedReader.

  3. Выйдите из статического мехтода.Сделать их нон статическую создавать и объект класса и вызывать их из основного метода

Так все о оптимизации кода

А также вы можете просто увеличить объем памяти для виртуальной машины Java и испытания, делая как это java -Xmx1556m -Xms1024m когда губит приложение в командной строке

Кстати, спасибо за вопрос этот этот вопрос ее дает мне что-то, чтобы думать о

+0

Спасибо. это помогло много. Проблема была в моих звонках. Я проверял с рекурсией, если что-то == 0, но всегда было 0, так как это никогда не передавалось оригинальному arraylist. Исправлен код, и теперь он работает. Ты помог мне найти проблему. – Soybean

+0

Рад узнать, что он решил сейчас :). Хотя я мог бы оказать любую конкретную помощь. – Saif