2015-04-28 2 views
2

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

double int int int 
double int int int 
... 
double int int int 

Он сохраняется в файле "raw.txt".

Вывод должен выглядеть следующим образом:

int int int 
int int int 
... 
int int int 

Это то, что я пытался до сих пор:

import java.io.*; 
import java.util.*; 

public class DATA { 
    public static void main(String[] args) throws FileNotFoundException { 
     PrintWriter writer = new PrintWriter(new File("sorted.txt")); 
     Scanner reader = new Scanner(new File("raw.txt")); 
     int temp = 0, count = 1; 
     while (reader.hasNext()) { 
      try { 
       temp = reader.nextInt(); 
      } 
      catch (InputMismatchException e) { 
       reader.nextLine(); 
       temp = (int) reader.nextDouble(); 
      } 
      writer.print(temp); 
      if (count % 4 == 0) 
       writer.println(); 
      count++;  

     } 
     writer.close(); 
     reader.close(); 
    } 
} 

текущий код генерирует InputMismatchException. Вся помощь очень ценится.

+1

и что не так с этим кодом? Создает ли файл? – maskacovnik

+0

Текущий код генерирует «InputMismatchException». Я не знаю, почему, поскольку я окружал единственную линию, которая могла бы бросить ее в блок catch try. – oakTree

+1

Скорее всего, исключение выбрасывается здесь 'reader.nextDouble();'. Но, не зная вашего реального входа, это все еще догадывается. – SubOptimal

ответ

1

InputMismatchException может быть выброшен, потому что это Пустоты Integer либо Double
Это гораздо лучше, чтобы прочитать часть в виде строки, а затем решить
Когда решает, он бросает NumberFormatException, который может быть пойманной
В следующем коде есть два писателя, разделенных, как вы хотели, он мог выглядеть лучше, чем этот код, может быть
Я исправил ваше письмо в файл. Я не тестировал его, но я действительно думаю, что если вы сделаете writer.print(temp);, он поместит все целые числа без пробелов, которые тогда бесполезны.
Попробуйте этот код, но не тестировалось

import java.io.*; 
import java.util.*; 

public class DATA { 
    public static void main(String[] args) throws FileNotFoundException { 
     PrintWriter writerInt = new PrintWriter(new File("sortedInt.txt")); 
     PrintWriter writerDou = new PrintWriter(new File("sortedDou.txt")); 
     Scanner reader = new Scanner(new File("raw.txt")); 
     int temp = 0, countInt = 1, countDou = 1; 
     while (reader.hasNext()) { 
      String next = reader.next(); 
      try{ 
       temp=Integer.parseInt(next); 
       writerInt.print(temp+" "); 
       if (countInt % 4 == 0) 
        writerInt.println(); 
       countInt++;  
      }catch(NumberFormatException e){ 
       try{ 
        writerDou.print(Double.parseDouble(next)+" "); 
        if (countDou % 4 == 0) 
         writerDou.println(); 
        countDou++; 
       }catch(NumberFormatException f){ 
        System.out.println("Not a number"); 
       } 
      } 

     } 
     writerInt.close(); 
     writerDou.close(); 
     reader.close(); 
    } 
} 
2

Основываясь на своем условии код, который вы только хотите разделить файлы и не заботиться о себе в double и int значений. Таким образом, вы можете обрабатывать файл как обычный текстовый файл и разбивать значения на разделительный пустой символ.

Фрагмент делает некоторые предположения в формате файла raw.txt и не оптимизирован. Поэтому это должна быть простая задача внести в нее изменения, основываясь на ваших потребностях.

public static void main(String[] args) throws IOException { 
    List<String> rawLines = Files.readAllLines(Paths.get("raw.txt")); 
    try (Writer intWriter = Files.newBufferedWriter(
      Paths.get("int_values.txt"), 
      StandardOpenOption.CREATE_NEW); 
     Writer doubleWriter = Files.newBufferedWriter(
      Paths.get("double_values.txt"), 
      StandardOpenOption.CREATE_NEW)) { 
     for (String line : rawLines) { 
      // the split might need to be amended if the values 
      // are not separated by a single blank 
      String[] values = line.split(" "); 

      // to be amended if there are not alway four values in a row 
      if (values.length != 4) { 
       continue; 
      } 

      doubleWriter.write(values[0]); 
      doubleWriter.write(System.lineSeparator()); 

      intWriter.write(values[1]); 
      intWriter.write(' '); 
      intWriter.write(values[2]); 
      intWriter.write(' '); 
      intWriter.write(values[3]); 
      intWriter.write(' '); 
      intWriter.write(System.lineSeparator()); 
     } 
    } 
} 
Смежные вопросы