2014-04-27 2 views
-1

메소드에서 파일을 읽는 프로그램을 만들어야합니다. 파일은 "data.txt"유형이며 각 행에 하나의 숫자가있는 숫자 목록 (이중 데이터 유형)을 갖습니다. 예 :파일의 총 요소 수를 배열로 가져 오는 방법은 무엇입니까?

23.4 
12.3 
111.4533 

그때 배열 (NOT 2 차원 배열)에 넣고 메인 방법에 반환해야합니다. filename.length()을 사용했지만 배열 크기가 더 커야하고 범위를 벗어나는 배열이 나타납니다. while 루프에서 배열을 초기화 할 수 있지만 배열의 크기를 먼저 선언해야한다는 것을 계속해서 알 수 있습니다. 그래서 while 루프를 사용하여 줄 수를 얻은 다음 다른 루프를 사용하여 요소를 입력하려고했지만 배열을 초기화하지 않고 배열을 기본 메서드로 돌려 보내지 않습니다. 여기까지 내가 무엇을 가지고 :

java.io.File file = new java.io.File(file); 
int arraySize = (int)file.length(); 
int size = 0; 
int i = 0; 
try{ 
    Scanner input = new Scanner(file); 
    while(input.hasNextLine()){ 
     size++; 
    }  
    double [] array; 
    array1 = new double [size]; 

    while(input.hasNext()){ 
     array[i] = input.nextDouble(); 
     i++; 
    } 

어떤 제안? 나는 정말로 이것에 붙어있다. 감사.

+5

배열 대신 ArrayList를 사용하면 미리 크기를 알 필요가 없습니다. 그래도 배열을 반환해야한다면 반환하기 전에 ArrayList를 배열로 변환하십시오. –

+0

제 대답이 도움이되는지 알려주세요. –

+0

이전에 배열 목록을 사용하지 않았기 때문에 불행히도 일반 배열을 사용해야합니다. – user3552956

답변

0

지금 문제는 당신이 크기를 결정 후, 그래서 Scanner 파일의 끝에 그래서 더 이상 복식이없는의 Scanner을 재정의하지 않는 것입니다

또한 크기를 결정할 때 각 줄마다 실제로 읽어야하므로 줄 바꿈을 건너 뛰거나 무한 루프가 발생한다고 생각합니다. 한 줄로 읽지 않으면 항상 더 많이 읽습니다.

이 (을 시험하고 작동) 시도 :

java.io.File file = new java.io.File(file); 
int size = 0; 
int i = 0; 
try { 
    Scanner input = new Scanner(file); 
    while(input.hasNextLine()){ 
     input.nextLine(); // have to change the lines 
     size++; 
    }  
    double [] array; 
    array = new double [size]; 

    // reopen the file so you start from the beginning again 
    input = new Scanner(file); 

    while(input.hasNext()){ 
     array[i] = input.nextDouble(); 
     i++; 
    } 

    // print out the array 
    for (double d : array) { 
     System.out.println(d); 
    } 

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

아니면 그냥 더 정의 된 크기가없는 ArrayList를 사용할 수있다 (당신은 .add 그것에 요소와는 그래서 당신은 필요가 없습니다 수 있습니다 크기를 미리 알고 그것을 채우기 위해). 원하는 경우 ArrayList을 일반 배열 afterword로 변환하십시오.

java.io.File file = new java.io.File("C:\\Users\\Mike\\Desktop\\data.txt"); 
try { 
    Scanner input = new Scanner(file); 
    ArrayList<Double> list = new ArrayList<Double>(); // define empty ArrayList 

    while(input.hasNextLine()) { 
     list.add(input.nextDouble()); // have to change the lines 
    } 

    // convert ArrayList to array 
     // (although you don't need to do this if you're fine with an ArrayList) 
    double[] array = new double[list.size()]; 
    for (int i = 0; i < list.size(); i++) { 
     array[i] = list.get(i); 
    } 

    // print out the array 
    for (double d : array) { 
     System.out.println(d); 
    } 

} catch (Exception e) { 
    e.printStackTrace(); 
} 
+0

고맙습니다. 당신은 많은 도움이되었습니다. 작동했지만, .hasNextLine()이 무한대로 실행되지 않게하려면 몇 가지를 변경해야했습니다. – user3552956

+0

@ user3552956 문제는 없습니다. 기꺼이 도와주세요. –

1

개의 가능한 해결책 :

a) 대신에 고정 된 어레이 (예를 들어,의 ArrayList)를 사용하는 수요 증가 컬렉션을 사용. 나중에 배열로 다시 변환 할 수도 있습니다.

b) 스캐너를 닫고 줄 수를 계산 한 후 파일을 다시 엽니 다.

0

filename 변수가 파일 이름의 문자열이라고 가정하면 filename.length은 이름에 총 문자 수만 제공합니다. File 개체를 filename이라고 부른 경우 filename.length()은 파일 길이의 long을 바이트 단위로 반환하고 그 안에있는 행 수는 반환하지 않습니다. 당신은 당신이 다음하지 않는 고정 길이 array 대신 확장 Collection를 사용하려면 Number of lines in a file in Java

그러나 가능성 :

는 여러 가지 답변이 질문을 참조 할 수있는 파일의 라인 수를 얻으려면 그것을 사용하기 전에 전체 파일을 계산하고 읽어야합니다. ArrayList과 같은 것이 이상적 일 수 있습니다. 하지만 그것은 유스 케이스에 달려있다.
당신은 항상 나중에 Array에 다시 ArrayList을 변환 할 수 있습니다

String[] lines = lineList.toArray(new String[lineList.size()]); 
0

나는 ArrayList에 사용을 권장합니다. 그렇게하면 배열을 만드는 동안 크기를 알 필요가 없습니다. 다른 사람들이 말했듯이 ArrayList에 값을 추가 한 후에 배열로 변환 할 수 있습니다.

귀하의 data.txt 파일에 공백없이 한 행씩 두 배가 있다고 가정합니다. 다음과 같은 코드를 사용할 수

ArrayList <Double> doubleArray = new ArrayList<Double>(); 
    Scanner fileScan = null; 

    try { 
     fileScan = new Scanner(new File("/path/to/file")); 
     while (fileScan.hasNextDouble()){ 
      doubleArray.add(fileScan.nextDouble()); 
    } 

    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
0

사용 코드 아래에 텍스트 파일의 라인으로

읽기 라인 및 배열에

변환의 ArrayList를 위해 ArrayList 두 번 구문 분석 된 가치를 두 배로 각 라인의 요소를 구문 분석 :

이 시도 .

String fileName=null; 
    File file = null; 
    try { 
      fileName="path/filename.txt"; 
      file = new File(fileName); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     // TODO: handle exception 
    } 

List<Double> elements = new ArrayList<>(); 

    try{ 
     Scanner input = new Scanner(file); 
     while(input.hasNextLine()){ 
      elements.add(Double.parseDouble(input.nextLine())); 
     } 

      double[] ret = new double[elements.size()]; 
      for(int index = 0;index < ret.length;index++) 
      ret[index] = elements.get(index); 

    System.out.println(ret); 
    System.out.println("end"); 
} 
    catch(Exception e){ 

    } 
관련 문제