2011-10-09 46 views
7

Giả sử tôi có một tập tin gọi là "input.txt" mà có một loạt các số nguyên dương trong đó:
Java: Đọc mảng các số nguyên từ tập tin

6 
5 
6 
8 
6 
2 
4 

và vân vân .... (một số nguyên trên mỗi dòng)

Tôi muốn đọc tệp này và biến nó thành một mảng. Số nguyên đầu tiên (trong trường hợp này là 6) cho biết số lượng chỉ mục hoặc phần tử trong mảng, do đó, 6 điểm. Các số khác điền vào mảng bắt đầu từ 0. Vì vậy, tại chỉ số 0, số là 5, tại chỉ số 1 số là 6, và cứ thế.

Ai đó có thể xin vui lòng chỉ cho tôi làm thế nào để đọc tập tin này và làm cho nó thành một mảng gọi là A và trả lại số nguyên trong mỗi chỉ số như n?

đây là những gì tôi có cho đến nay:

import java.io.*; 
public class inputFile { 
    public static jobScheduleRecursive(int[] A, int i) 
    { 
     try 
    { 
     FileReader filereader = new FileReader("input.txt"); 
     BufferedReader bufferedreader = new BufferedReader(filereader); 
     String line = bufferedreader.readLine(); 
     //While we have read in a valid line 
     while (line != null) { 
      //Try to parse integer from the String line 
      try { 
       System.out.println(Integer.parseInt(line)); 
      } catch (NumberFormatException nfe) { 
       System.err.println("Failed to parse integer from line:" + line); 
       System.err.println(nfe.getMessage()); 
       System.exit(1); 
      } 
      line = bufferedreader.readLine(); 
     } 
    } 
    catch(FileNotFoundException filenotfoundexception) 
    { 
     System.out.println("File not found."); 
    } 
    catch(IOException ioexception) 
    { 
     System.out.println("File input error occured!"); 
     ioexception.printStackTrace(); 
    } 
    return A; 
} 

Tôi nghĩ rằng tôi đang làm một cái gì đó hoàn toàn sai. Hãy giúp tôi. mẫu

Scanner s = new Scanner(new File("input.txt")); 
int[] array = new int[s.nextInt()]; 
for (int i = 0; i < array.length; i++) 
    array[i] = s.nextInt(); 
+2

Âm thanh như ... bài tập về nhà? –

+0

Bạn không cần phải đặt số lượng mục nhập trên dòng đầu tiên nếu bạn sử dụng cấu trúc Danh sách để lưu trữ các số. Bạn có thể dễ dàng chuyển đổi danh sách thành một mảng (có độ dài cố định) khi bạn đọc xong bằng cách gọi list.toArray() –

Trả lời

12

Sử dụng một Scanner và phương pháp Scanner.nextInt(), bạn có thể giải quyết việc này chỉ trong vòng một vài dòng

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

public class Task { 

    private BufferedReader input; 
    private PrintWriter output; 
    private StringTokenizer stoken; 

    String fin = "input"; 
    String fout = "output"; 


    private void solve() { // some solving code... 
     int n = nextInt(); 
     int[] mas = new int[n]; 
     for (int i = 0; i<n; i++){ 
      mas[i] = nextInt(); 
     } 
    } 



    Task() throws IOException { 
     input = new BufferedReader(new FileReader(fin + ".txt")); 
     output = new PrintWriter(new FileWriter(fout + ".txt")); 

     solve(); 

     input.close(); 
     output.flush(); 
     output.close(); 
    } 


    int nextInt() { 
     return Integer.parseInt(nextToken()); 
    } 


    long nextLong() { 
     return Long.parseLong(nextToken()); 
    } 


    double nextFloat() { 
     return Float.parseFloat(nextToken()); 
    } 


    double nextDouble() { 
     return Double.parseDouble(nextToken()); 
    } 


    String nextToken() { 
     while ((stoken == null) || (!stoken.hasMoreTokens())) { 
      try { 
       String line = input.readLine(); 
       stoken = new StringTokenizer(line); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return stoken.nextToken(); 
    } 


    public static void main(String[] args) throws IOException { 
     new Task(); 
    } 

} 

Trong phương thức resolve() bạn có thể xem cách đọc một số N (chiều dài của dãy số sau) và sau đó trong vòng lặp (0..N) Tôi đọc số nguyên từ đầu vào (trong trường hợp này là một tệp) .

+0

Việc lặp cho mỗi giá trị có vẻ như hiệu suất kém. – AndroidDev

+0

Có thể có giải pháp nhanh hơn. Tôi sẽ không khám phá chúng cho đến khi ứng dụng được lược tả và các nút cổ chai được xác định. – aioobe

5

Tôi nghĩ rằng bạn cần điều này cho các cuộc thi ACM-like :) Tôi sử dụng sau đây::

1
import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 

public class filee{ 
    public static void main(String[] args) throws FileNotFoundException { 
     File f = new File("l.txt"); 
     Scanner b = new Scanner(f); 
     int[] arr = new int[b.nextInt()]; 
      for(int i = 0; i < arr.length; i++){ 
       arr[i] = b.nextInt(); 
      } 
     for (int o : arr){ 
      System.out.println(o); 
     } 
    } 
} 
4

Java 8+

int[] ints = Files.lines(Paths.get("input.txt")) 
        .mapToInt(Integer::parseInt).toArray(); 
+0

Bạn cũng có thể thực hiện Files.lines (Paths.get ("input.txt")). MapToInt (Integer :: parseInt) .boxed(); để có được một danh sách không nguyên thủy. –

0

Nếu tập tin là một nguồn tài nguyên classpath:

int[] ints = Files 
      .lines(Paths.get(ClassLoader.getSystemResource("input.txt") 
        .toURI())).mapToInt(Integer::parseInt).toArray(); 

In nội dung từ file:

Arrays.stream(ints).forEach(System.out::println); 
Các vấn đề liên quan