2013-02-25 20 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 2013-02-25 16:46:11

回答

1

如果您的班级路径中有commons-io-x.x,则可以尝试以下代码。我已经使用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; 
    } 

} 

希望这有助于... 非常感谢你!

0

这纯粹是猜测,但似乎这些行是罪魁祸首:

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

我假设你调用for循环,这当然只能给你最后的处理线内这种方法。你需要做的是在函数之外声明keys,这样它就不会在每次调用周围函数时重新实例化。

0

你也可以检查calc字符串,我的猜测是,它仅包含一个行,然后你就必须检查

key.toString() 

方法。

之外,使用Java 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); 

} 

希望这会有所帮助。