2017-01-17 2 views
1

У меня есть текстовый файл, который я назвал read_me2 (link):Как прочитать файл, содержащий текст и целые числа и сохранить целые числа в списке массива

!This is for testing the ability to read a file 
1 3 
4 5 
6 7 
8 9 
1 
2 
3 
4 
5 6 4 

Я хочу, чтобы прочитать его и хранить данных в списке целых чисел с использованием возможностей Java 8. До сих пор я мог это сделать, но, по-моему, субоптимально. Можете ли вы мне помочь. Ниже, пожалуйста, найти свой код:

//This is my package 
    package ReadAFile; 

     // Modified http://www.mkyong.com/java8/java-8-stream-read-a-file-line-by-line/ 

     import java.io.IOException; 
     import java.nio.file.Files; 
     import java.nio.file.Paths; 
     import java.util.ArrayList; 
     import java.util.List; 
     import java.util.stream.Collectors; 
     import java.util.stream.Stream; 


     public class ReadAndStoreFileContents { 

      public static void main(String[] args) { 

       List<String> list2 = new ArrayList<>(); 

String fileName2 = "/Users/riccardo/Dropbox/A-Data/JavaSandBox/read_me2.txt"; 
       try (Stream<String> stream = Files.lines(Paths.get(fileName2))) { 
        list2 = stream. 
          filter(line -> !line.startsWith("!")). 
          collect(Collectors.toList()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 


    //   This will be certainly not optimal because I m reading the List a second time   

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

       for(String string : list2){ 
        for(String retval: string.split(" ")){ 
         intList.add(Integer.valueOf(retval)); 
        } 
        System.out.println(intList.toString()); 
       } 


      } 

     } 

Спасибо за ваше время,

Риккардо

+6

Этот вопрос лучше подходит для просмотра кода: http://codereview.stackexchange.com/ – nickb

ответ

1

Поскольку у вас есть Stream строк, выходящих из файла, вы можете плоским сопоставить их с одного строки, а затем сопоставить их Integers, а также собирать и печатать, что:

try (Stream<String> stream = Files.lines(Paths.get(fileName2))) { 
         list2 = stream 
           .filter(line -> !line.startsWith("!")) 
           .flatMap(line -> line.split(" ").stream()) 
           .map(Integer::valueOf) 
           .collect(Collectors.toList()); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
+1

'split' возвращает массив, поэтому вы не можете вызвать' stream() 'в результате. Вы должны использовать либо: .flatMap (Pattern.compile ("") :: splitAsStream) 'или' .flatMap (строка -> Arrays.stream (line.split (""))) ' – Holger

+0

Большое спасибо. – user7430476

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