2016-06-13 3 views
1

Я пытаюсь создать программу, которая объединит два разных текстовых файла в третий файл, который сортируется в порядке возрастания. Вот то, что два файла имеют в нихСлияние двух текстовых файлов и сортировка их на третий файл

Файл 1: 12 23 34 45 56 67 69 123 133

Файл 2: 4 5 10 20 35 44 100 130 150 160 180

А вот код, который я до сих пор:

try 
    { 

     FileReader file1=new FileReader("D://School//text1.txt"); 
     Scanner scan = new Scanner(new File("D://School//text1.txt")); 
     ArrayList<Integer> values = new ArrayList<Integer>(); 
     Collections.sort(values);  //sorting the values 
     while(scan.hasNextInt()) values.add(scan.nextInt()); 

     FileReader file2=new FileReader("D://School//text2.txt"); 
     scan = new Scanner(new File("D://School//text2.txt")); 
     values = new ArrayList<>(); 
     Collections.sort(values);  //sorting the values. 
     while(scan.hasNextInt()) values.add(scan.nextInt()); 

     BufferedReader br1 = new BufferedReader (file1); 
     BufferedReader br2 = new BufferedReader(file2); 

     String temp1 = ""; 
     String temp2 = ""; 

     while(br1.readLine() !=null) 
     { 
      temp1=br1.readLine()+temp1; 
     } 
     while(br2.readLine()!=null) 
     { 
      temp2=br2.readLine()+temp2; 
     } 
     String temp = temp1 + temp2; 



     FileWriter fw=new FileWriter("D://School//text3.txt"); 
     char buffer[]=new char[temp.length()]; 
     temp.getChars(0,temp.length(),buffer,0);       
     fw.write(buffer); 
     file1.close(); 
     file2.close(); 
     fw.close(); 
    } 

    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

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

Вот что программа напечатает на третий файл

12 23 34 45 56 67 69 123 133 4 5 10 20 35 44 100 130 150 160 180 

Я хочу, чтобы это было его сортировку в третий файл, как так

4 5 10 12 20 23 34 35 44 45 56 67 69 100 123 130 133 150 160 180 

Заранее спасибо :)

+0

Он не будет печатать третьему файлу, что вы говорите, он будет печатать на нем. Я выполняю ваш код, а третий файл содержит «nullnull». Или когда я поместил все числа в новые строки, он будет содержать «null123674523null16013044205'. – Arjan

+0

Это приводит меня к вопросу: все ли эти цифры на одной линии или каждая на отдельных строках? – Arjan

+0

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

ответ

0

Когда вы звоните Collections.sort(values);, вы делаете разборку ArrayList.

Вам необходимо позвонить по номеру Collections.sort(values); после того, как вы добавили все значения в ArrayList.

Вы можете запустить эти примеры для теста:

Пример 1:

List<Integer> values = new ArrayList<Integer>(); 

// sort the list first 
Collections.sort(values); 

values.add(5); 
values.add(3); 
values.add(8); 
values.add(1); 

System.out.println(values); 

Выходы: [5, 3, 8, 1]

Пример 2:

List<Integer> values = new ArrayList<Integer>(); 

values.add(5); 
values.add(3); 
values.add(8); 
values.add(1); 

// sort the list now 
Collections.sort(values); 

System.out.println(values); 

Выходы: [1, 3, 5, 8]

+1

Это само по себе не исправит, есть больше проблем с этим кодом. – Arjan

+0

Могу ли я добавить значения непосредственно из текстового файла вместо того, чтобы добавлять каждый номер отдельно в исходный код? –

+0

Ну, вам нужно разобрать их, как вы делаете сейчас, с помощью 'scan.hasNextInt()' –

1

Я предлагаю вам использовать TreeSet, и я видел некоторые проблемы в вашем коде.

TreeSet<Integer> treeSet = new TreeSet<Integer>(); 
while(scan.hasNextInt()) treeSet.add(scan.nextInt()); 
scan = new Scanner(new File("D://School//text2.txt")); 
//Do not new Collection!!!!! 
while(scan.hasNextInt()) treeSet.add(scan.nextInt()); 

и вы можете для каждого-коллекции

for (Integer i : treeSet) { 
     System.out.println(i); 
} 

и вы можете попробовать это, если у вас есть jdk8.

ArrayList<Integer> ints = new ArrayList<>(); 
    Files.readAllLines(Paths.get("D://School//text1.txt"), StandardCharsets.UTF_8).forEach(x -> Arrays.asList(x.split(" ")).stream().forEach(y -> ints.add(Integer.parseInt(y)))); 
    Files.readAllLines(Paths.get("D://School//text2.txt"), StandardCharsets.UTF_8).forEach(x -> Arrays.asList(x.split(" ")).stream().forEach(y -> ints.add(Integer.parseInt(y)))); 
    Collections.sort(ints); 
    StringBuilder sb = new StringBuilder(); 
    ints.stream().map(x -> x + " ").forEach(sb::append); 
    Files.write(Paths.get("D://School//text3.txt"),sb.toString().getBytes(),StandardOpenOption.WRITE,StandardOpenOption.CREATE); 
+1

Примечание. Если в текстовых файлах есть дубликаты, вы потеряете эту информацию с помощью TreeSet. –

+0

Очень хорошее решение лямбда! К сожалению, это генерирует исключение NumberFormatException, когда файлы text1/text2 имеют пустую первую строку (как описано OP в комментарии к вопросу). Но tbh, мне действительно интересно, была ли эта пустая строка частью задания или обходным путем OP, чтобы данные соответствовали кодовому коду: P +1 в любом случае :) – Arjan

+0

Да, пустая строка была обходным путем. Я все еще в процессе изучения java, спасибо за всю помощь до сих пор ребята :) –

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