Java Вопрос по файлам и чтению их в массивы

299
11 февраля 2017, 06:51

Простите, если путанно и многословно объясняю...

Есть три файла. Содержания примерно такого:

Файл1:

бла1
бла2
бла3

Файл2:

бла0
бла8
бла1
бла17
бла2
бла6

Файл3:

блаблабла
бла бла
бла бла бла
бла
блабла
бла бла

То есть, как видно, некоторые (не все) строки из файла1 входят в файл2, а кол-во строк файла2 = кол-ву строк файла3

Задача: найти номера тех строк в файле2, которые совпадают со строками файла1 и записать в файл4 (новый) строки содержания "<искомая строка> + <строка из файла3 с номером равным номеру искомой строки в файле2>

Ну, например (исходя из моего примера). Находим, что бла1 входит в третьей строке файла2, а бла2 в пятой строке. Значит, в файле4 запишем следующее: бла1 бла бла бла \n бла2 блабла

Надеюсь, понятно объяснил...

Я решил, что проще всего загнать все файлы в три разных массива и массивы уже сравнивать.

В чем проблема: массивы обнуляются сразу после цикла чтения файла. Примеры кода:

File cena = new File("cena.txt");
        FileReader fileReader = new FileReader(cena);
        BufferedReader reader = new BufferedReader(fileReader);
        String line = null;
        String[] cena_array;
        cena_array = new String[1000];
        int cena_n = 0;
        while ((line = reader.readLine()) != null){
            cena_n++;
            cena_array[cena_n] = line;
            System.out.println(cena_array[cena_n]); // Здесь выводит нормально элемент массива
        }
        System.out.println(cena_array[1]); // а здесь уже null, как и cena_n

Пробовал также через сканнер:

Scanner cena = new Scanner(new File("cena.txt"));
        String[] cena_array;
        cena_array = new String[1000];
        int cena_n = 0;
        while(cena.hasNext()){
            cena_n++;
            cena_array[cena_n] = cena.nextLine();
            System.out.println(cena_array[cena_n]); // Здесь снова нормально выводит элементы
        }
        System.out.println(cena_array[2]); // Ну, а здесь null

Пробовал обойтись одними файлами, написал вот такую лабуду:

        String s = "";

        Scanner cena = new Scanner(new File("cena.txt"));
        FileWriter wrt;
        wrt = new FileWriter("res.txt");
        String[] cena_array;
        cena_array = new String[1000];
        int n = 0;
        int k = 0;
        while(cena.hasNext()){
            s = cena.nextLine();
            Scanner ost = new Scanner(new File("ost.txt"));
            boolean fl = true;
            n = 0;
            while ((ost.hasNext()&&(fl))){
              n++;
              if (s.equals(ost.hasNext())){
                fl = false;
                System.out.println("Нашли строку");
              } 
            }
            System.out.println("Вышли из while");
            if (!fl){
                Scanner ost_ost = new Scanner(new File("ost_ost.txt"));
                k = 1;
                while (k < n){
                    ost_ost.hasNext();
                }
                wrt.append(s+" "+ost_ost.hasNext()+"\n");
                ost_ost.close();
                System.out.println("Записали в файл");
            }

В этом случае, программа выполняется бесконечно, не доходит до System.out.println("Нашли строку"); и до конца первого файла. Ну, это дурацкий вариант, конечно

Подскажите, что сделать в первых двух вариантах, чтобы массивы не обнулялись по выходу из цикла?

Answer 1

У меня получилось такое решение:

try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("result.txt"))) {
    Files
        //построчно считываем первый файл
        .lines(Paths.get("first.txt"))
        .map(line -> {
               try {
                  //построчно считываем второй файл
                  return Files
                            .lines(Paths.get("second.txt"))
                            //добавляем информацию о номере строки
                            .map(
                               new Function<String, Entry<Integer, String>>() {
                                   private AtomicInteger lineNumber = new AtomicInteger();
                                   @Override
                                   public Entry<Integer, String> apply(String line) {
                                        return new SimpleImmutableEntry<>(lineNumber.getAndIncrement(), line);
                                   }
                                })
                            //ищем совпадение со строкой из первого файла
                            .filter(entry -> line.equalsIgnoreCase(entry.getValue()))
                            .findFirst();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                })
          //фильтруем строки для которых нашлось совпадение
          .filter(Optional::isPresent)
          .map(Optional::get)
          .map(entry -> {
               try {
                  return Files
                          //читаем третий файл
                          .lines(Paths.get("third.txt"))
                          //получем n строку, где n номер строки найденой во втором файле
                          .skip(entry.getKey())
                          .findFirst()
                          //объединяем полученную строку со строкой из второго файла
                          .map(e -> e + entry.getValue())
                          .get();
                } catch (IOException e) {
                    e.printStackTrace();
                }
           })
           //записываем результат
           .forEach(line -> {
                try {
                    writer.write(line);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
    }
READ ALSO
Не округлять double до целого числа [дубликат]

Не округлять double до целого числа [дубликат]

На данный вопрос уже ответили:

340
/utils/add/message - не могу сделать RegExp

/utils/add/message - не могу сделать RegExp

Подскажите пожалуйста как составить regexp для такой строки /utils/add/message? таких /действие может быть сколько угодно

257
Проверка существования ключа в Map

Проверка существования ключа в Map

Необходимо в HashMap сохранить "ключ -> массив значений"

356
android:Взаимодействие Service и UI

android:Взаимодействие Service и UI

Подскажите наиболее простую, надежную и наиболее "синхронную" схему взаимодействия Компонента с GUI и ServiceВ ИНЕТЕ описано много схем, но, как...

308