2014-10-26 5 views
0

Я знаю, что этот вопрос кажется дублирующим, но я снова и снова рассматривал каждый связанный с ним вопрос и не мог найти ответ на мой вопрос. Я должен читать из текстового файла, имя которого определяется из пользовательского ввода. Файл содержит несортированный набор двойных чисел типа, такие как:Чтение из текстового файла и рекурсивное слияние его сортировки

«0,1212312» «0,0013315» «0,0106026»

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

import java.io.*; 
import java.nio.file.Path; 
import java.util.*; 
import java.lang.*; 
public class ProjectAssingment3 
{ 
    public static void main(String[] args) throws IOException { 
     System.out.println("Enter file name please:"); 
     Scanner input; 
     input = new Scanner(System.in); 
     String in; 
     in = input.nextLine(); 
     int count = 0; 
     for(int i = 0; i < in.length(); i++) 
     { 
      if(Character.isWhitespace(in.charAt(i)))count++; 
     } 
     while(in.equals(null)||(count>1)) 
     { 
      count=0; 
      for(int i = 0; i < in.length(); i++) // Counts the white spaces to determine the number of arguments in input 
      { 
       if(Character.isWhitespace(in.charAt(i))) 
      count++; 
      } 
      System.out.println("Invalid input! Please try again!"); 
      input = new Scanner(System.in); 
      in = input.nextLine(); 
     } 
     try { 
      Scanner sc = new Scanner(new FileReader(new File(in))); 
      List<Double> lines = new ArrayList<Double>(); 
      int i =0; 
      while (sc.hasNextLine()) 
      { 
      if(sc.nextLine().equals(null))//Checks if any empty lines 
      { 
       System.out.println("Empty Line Encountered!"); 
       System.exit(-1); 
      } 
      else if(!sc.hasNextDouble())//Checks if any non-double type lines 
      { 
       System.out.println("Invalid Line Encountered" + sc.nextLine()); 
       System.exit(-1); 
      } 
      lines.add(Double.parseDouble(sc.nextLine())); 
      System.out.println(lines.get(i));i++; //Prints out original Unsorted array. 
     } 
     sc.close(); 

     //Unboxes the values from the ArrayList onto a array of type double 
     double arr[] = new double[lines.size()]; 
     for(int j=0;j<arr.length;j++) 
     { 
      arr[j] = lines.get(j); 
     } 
     mergeSort(arr, 0, arr.length - 1); 

     //Prints the sorted array 
     for(int x=0;x<arr.length;x++) 
     { 
      System.out.println(arr[x]); 
     } 
    } catch (IOException e) { 
     System.out.print("Failed to read input file:" + e.getMessage()); 
    } 
} 
public static void doMerge(double [] numbers, int left, int mid, int right) 
{ 
    double [] temp = new double[25]; 
    int i, left_end, num_elements, tmp_pos; 
    left_end = (mid - 1); 
    tmp_pos = left; 
    num_elements = (right - left + 1); 
    while ((left <= left_end) && (mid <= right)) 
    { 
     if (numbers[left] <= numbers[mid]) 
      temp[tmp_pos] = numbers[left++]; 
     else 
      temp[tmp_pos++] = numbers[mid++]; 
     } 
     while (left <= left_end) 
      temp[tmp_pos++] = numbers[left++]; 
     while (mid <= right) 
      temp[tmp_pos++] = numbers[mid++]; 
     for (i = 0; i < num_elements; i++) 
     { 
      numbers[right] = temp[right]; 
      right--; 
     } 
    } 
    public static void mergeSort(double [] numbers, int left, int right) 
    { 
    int mid; 
    if (right > left) 
    { 
     mid = (right + left)/2; 
     mergeSort(numbers, left, mid); 
     mergeSort(numbers, (mid + 1), right); 
     doMerge(numbers, left, (mid+1), right); 
    } 
} 

}

И да, это действительно поручение, данное мне, но я честно не просит какой-либо из вас, ребята, просто сделай это для меня. Я искренне топал и просто просил разъяснений!

Я ценю любые усилия, внесенные в этот глупый вопрос!

+0

Пробовали ли вы печать, чтобы проверить, где на самом деле он работает неправильно? – smttsp

+0

Да, у меня были линии печати на всем протяжении, но я удалил, прежде чем публиковать его здесь, поскольку я думал, что это запутано. Кажется, он распознает недопустимые имена файлов, но всякий раз, когда я набираю фактическое имя файла, он просто не отвечает –

+0

Тогда, похоже, у вас проблемы с '/', '\' или 'whitespace'. У вашего имени файла есть пробел? – smttsp

ответ

0

Когда я даю полный путь, он принимает файл, но дает другое исключение.

Также вы бросаете исключение, но кто его ловит?

Одна последняя вещь, синтаксис основной является public static void main(String[] args), он MUST получить String[]args в качестве параметра, (по крайней мере, в затмении), в противном случае он не узнает основной метод

+0

Благодарим вас за ответ. Проблема, похоже, не связана с каталогом путей, так как программа может найти файл без проблем. А также, не могли бы вы подробнее рассказать о своем вопросе. Я не очень хорошо знаком с попыткой и уловкой, поэтому я мог бы действительно использовать некоторые разъяснения. Спасибо –

+0

Когда вы бросаете какое-то исключение, какой-то другой метод должен его поймать, поэтому нет смысла бросать исключение в main – smttsp

+0

Я уверен, что у меня есть объявление catch в моем коде, но я дважды проверю это.Спасибо –

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