Задать вопрос

Java ошибка в сортировки двух файлов в один, в чем ошибка?

Здравствуйте, пишу программу на JAVA по сортировке двух (отсортированных) файлов в один. Столкнулся с тем, что программа выводит неверный результат. Несколько раз переписывал программу с самого начала, но ничего не помогает. Сперва тестировал на массивах, программа работает отлично. А когда подключаю потоки для чтения и записи в файл, выходит неправильная сортировка. Помогите, голову уже сломал. В чем ошибка?

Вот код программы:
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.FileWriter; 

public class MergeS {
	public static void main(String[] args) { 
	    try { 
	     FileReader fileReader1 = new FileReader("in11.txt");//Создает поток чтения и читает 
	     FileReader fileReader2 = new FileReader("in22.txt");//Создает поток чтения и читает 
	     BufferedReader bufferedReader1 = new BufferedReader(fileReader1); // Помещает прочитанное из fileReader1 в буфер bufferedReader1
	     BufferedReader bufferedReader2 = new BufferedReader(fileReader2); // Помещает прочитанное из fileReader2 в буфер bufferedReader2
	
	     String line1 = bufferedReader1.readLine(); // Читает строку из bufferedReader1 и присваивает ее line1
	     String line2 = bufferedReader2.readLine(); // Читает строку из bufferedReader2 и присваивает ее line2
	
	     FileWriter tmpFile = new FileWriter("out.txt", false); // Создает поток tmpFile для записи в файл
	     int whichFileToRead = 0;

	     boolean file_1_reader = true; 
	     boolean file_2_reader = true; 
	     
	     while (file_1_reader || file_2_reader) { 
	      if (file_1_reader == false) { 
		       tmpFile.write(line2 + "\r\n"); 
		       whichFileToRead = 2; 
		       System.out.println("Write : " + line2);
	      } else if (file_2_reader == false) { 
		       tmpFile.write(line1 + "\r\n"); 
		       whichFileToRead = 1; 
		       System.out.println("Write : " + line1);
	      } else { 
	    	   String value1 = line1.substring(0); // получение символов из строки line1, и присваивает их value1
		       String value2 = line2.substring(0); // получение символов из строки line2, и присваивает их value2 
		       System.out.print("Sort : " + value1 + " vs "+ value2 + " ");

		       int ans = value1.compareTo(value2); // сравнение двух значений value1 и value2 и присваивает это переменой ans
		       if (ans < 0) { 
			        tmpFile.write(line1 + "\r\n"); 
			        whichFileToRead = 1; 
			        System.out.println("Write : " + line1);
		       } else if (ans > 0) { 
			        tmpFile.write(line2 + "\r\n"); 
			        whichFileToRead = 2; 
			        System.out.println("Write : " + line2);
		       } else if (ans == 0) { 
			        tmpFile.write(line1 + "\r\n"); 
			        whichFileToRead = 1; 
			        System.out.println("Write : " + line1);
		       } 
	      } 
		      if (whichFileToRead == 1) { 
			       line1 = bufferedReader1.readLine(); // Читает строку из буфера bufferedReader1 и присваивает line1
			       if (line1 == null) 
			    	   file_1_reader = false; // Если line1 пустое, тогда file_1_reader присваивается значение false
		      } else { 
			       line2 = bufferedReader2.readLine(); // Читает строку из буфера bufferedReader2 и присваивает line2
			       if (line2 == null) 
			    	   file_2_reader = false; // Если line2 пустое, тогда file_2_reader присваивается значение false
		      } 
	     }
	     tmpFile.close(); 
	     bufferedReader1.close(); 
	     bufferedReader2.close(); 
	     fileReader1.close(); 
	     fileReader2.close(); 
	
	    } catch (Exception e) { 
	    	System.out.println(e); 
	    } 
	} 
}

Вот что записывается в файл out.txt :

10
11
21
23
24
40
41
50
65
75
76
77
78
78
78
78
86
900
2100
2200
2300
2400
2500
98
101
190
1100
1200
3000
5000

  • Вопрос задан
  • 111 просмотров
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 1
@cudu
java developer
Не читая весь код: Вы же используете FileWriter, который последовательно записывает данные в файл, каким образом идет сортировка ранее записанных значений?
Вам надо отсортировать прочитанные значения в памяти, затем все уже отсортированные записать в файл. Либо использовать RandomAccessFile, что усложнит и не без того непросто написанный код.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы