0

テキストファイルから整数入力を渡すためのJavaコードを作成しました。たとえば1 10 39 59 20 60 38、空のスペースがある場合は文字列を分割する必要があります。

入力は1行で与えられます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, .."

上記の入力にコードを使用すると、入力ファイルの最後の行のみが考慮され、前の行はすべて無視されます。

4

5 に答える 5

1

クラスパスにcommons-io-xxがある場合は、次のコードを試すことができます。デモにはcommons-io-2.4を使用しました。また、ここでは入力を文字列と想定しています。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;
    }

}

これがお役に立てば幸いです...ありがとうございました!

于 2013-02-25T17:37:16.970 に答える
0

文字列をチェックすることもできますcalc。私の推測では、文字列には1行しか含まれていないため、文字列をチェックする必要があります。

key.toString()

方法。

さらに、Java 1.7では、ArrayListを次のように初期化できます。

ArrayList<Integer> keys = new ArrayList<>();
于 2013-02-25T16:56:57.277 に答える
0

これは純粋な推測ですが、これらの行が原因のようです。

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

ループ内でこのメソッドを呼び出していると仮定しますfor。もちろん、最後に処理された行のみが表示されます。あなたがする必要があるkeysのは、関数の外で宣言することです。そうすれば、周囲の関数を呼び出すたびにそれが再インスタンス化されることはありません。

于 2013-02-25T16:45:55.637 に答える
0

テキストキーパラメータでファイルのすべての行を連結していないようです。

Apache FileUtilsを使用して、単一の文字列var(http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#readFileToString(java。 io.File)

于 2013-02-25T17:01:44.350 に答える
0

ファイルを読み取るときは、基本的にreadLine()メソッドを呼び出します。このメソッドは、現在の行のデータを含む文字列を提供します。しかし、あなたの場合、ファイルの最後にいるときに文字列が読み取られ、その文字列が分割されて文字列配列に割り当てられます。したがって、ここで以前の値が失われます。そのため、この状況を回避するには、現在の結果を格納する一時配列を1つ取得し、その結果を結果の配列に追加する必要があります。

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

String temp;

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

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

}

お役に立てれば。

于 2013-02-25T17:05:14.677 に答える