Я знаю, что этот вопрос кажется дублирующим, но я снова и снова рассматривал каждый связанный с ним вопрос и не мог найти ответ на мой вопрос. Я должен читать из текстового файла, имя которого определяется из пользовательского ввода. Файл содержит несортированный набор двойных чисел типа, такие как:Чтение из текстового файла и рекурсивное слияние его сортировки
«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);
}
}
}
И да, это действительно поручение, данное мне, но я честно не просит какой-либо из вас, ребята, просто сделай это для меня. Я искренне топал и просто просил разъяснений!
Я ценю любые усилия, внесенные в этот глупый вопрос!
Пробовали ли вы печать, чтобы проверить, где на самом деле он работает неправильно? – smttsp
Да, у меня были линии печати на всем протяжении, но я удалил, прежде чем публиковать его здесь, поскольку я думал, что это запутано. Кажется, он распознает недопустимые имена файлов, но всякий раз, когда я набираю фактическое имя файла, он просто не отвечает –
Тогда, похоже, у вас проблемы с '/', '\' или 'whitespace'. У вашего имени файла есть пробел? – smttsp