2013-02-25 5 views
0

텍스트 파일에서 정수 입력을 전달하기위한 Java 코드를 작성했습니다. 1 10 39 59 20 60 38 그리고 빈 공간이있을 때 문자열을 분할해야합니다.주어진 입력을 파일에서 분리하는 방법은 무엇입니까?

입력이 input.txt

내 코드를 한 줄에 주어진 것은 : 나는 다른 작업을 위해 분리 된 값을 사용하여 행을 분할 한 후

public void reduce(Text key, Iterator<IntWritable> values, 
     OutputCollector<Text, IntWritable> output, Reporter reporter) 
     throws IOException { 

    String calc; 
    calc = key.toString(); 

    ArrayList<Integer> keys = new ArrayList<Integer>(); 
    String[] data = calc.split(" "); 

    for (String s : data) { 
     int intData = Integer.parseInt(s); 
     keys.add(intData); 
    } 

    int val = 0; 
    for (int a : keys) { 
     // some tasks 
    } 
} 

. 내 질문은 동일한 파일 (다른 라인에있는 값)에있는 모든 값을 분할하여 배열에 저장하는 방법입니다.

다음이 input.txt에 주어진 입력이라고 가정하면 모든 값을 분할하여 배열에 저장하는 방법은 무엇입니까?

예 입력 :

1 4 92 58 30 82 
49 50 38 30 29 20 
... 

예상 출력 : 나는 위의 입력에 내 코드를 사용하는 경우

array1="1,4,92,58,30,82,49,50,38,30,29,20, .." 

가 입력 파일의 마지막 라인이 고려 - 모든 이전 선은 무시됩니다.

+1

이 함수는 어떻게 호출됩니까? – Woot4Moo

답변

1

클래스 경로에 commons-io-x.x가있는 경우 다음 코드를 시도 할 수 있습니다. 데모 용으로 commons-io-2.4를 사용했습니다. 또한 여기에 입력을 String으로 가정했습니다. Integer.parseInt (String str)를 사용하여 입력 파일에서 정수 값을 가져올 수 있습니다.

package com.stack.overflow.works.service; 

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import org.apache.commons.io.FileUtils; 

/** 
* 
* @author sarath_sivan 
* 
*/ 

public class FileIOService { 

    private static final String BLANK_SPACE = " "; 

    public static void main(String[] args) { 
     FileIOService.run(); 
    } 

    public static void run() { 
     long startTime = System.currentTimeMillis(); 
     String fileName = "C:/Users/sarath_sivan/Desktop/input.txt"; 
     FileIOService.display(split(getContent(fileName))); 
     long stopTime = System.currentTimeMillis(); 
     long elapsedTime = stopTime - startTime; 
     System.out.println("Total Time: "+ elapsedTime + " Milliseconds..."); 
    } 

    public static void display(List<String> splitsList) { 
     for (String split: splitsList) { 
      System.out.println(split); 
     } 
    } 

    public static List<String> split(String content) { 
     List<String> splitsList = new ArrayList<String>(Arrays.asList(content.split(BLANK_SPACE))); 
     return splitsList; 
    } 

    public static String getContent(String fileName) { 
     File file = new File(fileName); 
     String content = null; 
     try { 
      content = FileUtils.readFileToString(file); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return content; 
    } 

} 

희망이 있습니다. 대단히 고마워요!

0

이 순수한 추측이지만,이 라인은 범인 것 같다 :

ArrayList<Integer> keys = new ArrayList<Integer>(); 
      String [] data = calc.split(" "); 

당신은 물론 단지 당신에게 마지막으로 처리 된 라인을 줄 것 for 루프 내부에이 메소드를 호출하는 가정이. 당신이해야 할 일은 함수 외부에 keys을 선언하는 것입니다. 그렇게하면 주변 함수를 호출 할 때마다 다시 인스턴스화되지 않습니다.

0

당신은 또한 calc 문자열을 확인할 수 있습니다, 내 생각은 하나 개의 라인을 포함하고 당신이

key.toString() 

방법을 확인해야한다는 것입니다.

게다가, 자바 1.7 당신은 당신이 텍스트 키 매개 변수 파일의 모든 라인을 연결하지 않는 것 같다

ArrayList<Integer> keys = new ArrayList<>(); 
0

당신에게 포함 된 문자열을 줄 것이다 당신은 기본적 내의 readLine() 메소드를 호출 할 파일을 읽고 현재 라인의 데이터. 그러나 당신의 경우에 일어날 일은 파일의 끝에 문자열이 읽혀질 때 그 문자열이 분할되어 문자열 배열에 할당 될 때입니다. 그래서 여기에 이전 값이 없어집니다. 따라서이 상황을 피하려면 현재 결과를 저장하고 그 결과를 결과 배열에 추가 할 임시 배열 하나를 가져와야합니다.

String[] mainArray=new Array[255]; // 255 for example 

String temp; 

while((temp=br.readLine()!=null)) 
{ 

String[] tempArr=temp.split(" "); 
addToMainArray(tempArr); 

} 

희망이 있습니다.