我编写了用于从文本文件传递整数输入的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, .."
当我将代码用于上述输入时,只考虑输入文件的最后一行 - 所有前面的行都被忽略了。
答案 0 :(得分: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;
}
}
希望这会有所帮助...... 非常感谢你!
答案 1 :(得分:0)
这是纯粹的推测,但似乎这些行是罪魁祸首:
ArrayList<Integer> keys = new ArrayList<Integer>();
String [] data = calc.split(" ");
我假设您在for
循环中调用此方法,这当然只会为您提供最后一个处理过的行。你需要做的是在函数之外声明keys
,这样就不会在每次调用周围函数时重新实现它。
答案 2 :(得分:0)
您还可以检查calc
字符串,我的猜测是它只包含一行,然后您必须检查
key.toString()
方法
此外,使用java 1.7,您可以使用
初始化ArrayListArrayList<Integer> keys = new ArrayList<>();
答案 3 :(得分:0)
您似乎没有在Text key参数中连接文件的所有行。
我想您可以使用Apache FileUtils在单个字符串var(http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#readFileToString(java.io.File))中读取您的文件
答案 4 :(得分:0)
当您正在读取文件时,您基本上调用了readLine()方法,该方法将为您提供包含当前行数据的字符串。但是在你的情况下会发生什么,当你在文件的末尾时,将读取一个字符串,该字符串将被拆分并分配给字符串数组。所以这里你以前的价值观会丢失。因此,为了避免这种情况,您必须使用一个临时数组来存储当前结果,然后将该结果添加到结果数组中。
String[] mainArray=new Array[255]; // 255 for example
String temp;
while((temp=br.readLine()!=null))
{
String[] tempArr=temp.split(" ");
addToMainArray(tempArr);
}
希望这有帮助。