从文本文件中读取数据并使用数组构建表

时间:2014-12-04 03:34:47

标签: java arrays io

我有一个名为" animals.txt"的输入文件:

sheep 10.5 12.3 4
horse 8.4  11.2 7
cow   13.7 7.2  10
duck  23.2 2.5  23
pig   12.4 4.6  12

简单地说一下,我想知道如何将4列数据存储到输入文件中的4个独立的1维数组中。

输出应该像这样......

[sheep, horse, cow, duck, pig]
[10.5, 8.4, 13.7, 23.2, 12.4]
[12.3, 11.2, 7.2, 2.5, 4.6]
[4, 7, 10, 23, 12]

到目前为止,我已经想出了如何将所有数据存储到一个大型数组中,但我需要知道如何将其分解并将每个列存储到自己的数组中。

我的代码:

public static void main(String[] args) throws FileNotFoundException {

    String[] animal = new String[5];
    int index = 0;

    File file = new File("animals.txt");
    Scanner input = new Scanner(file);

    while (input.hasNextLine() && index < animal.length) {
        animal[index] = input.nextLine();
        index++;
    }

3 个答案:

答案 0 :(得分:1)

您可以使用数组数组来存储您需要的内容,例如:

String[][] animal = new String[5][];

然后,当您读取文件时,存储所有值的数组,如下所示:

while (input.hasNextLine() && index < animal.length) {
    animal[index] = input.nextLine().split(" "); //split returns an array
    index++;
}

然后,当你想输出时,只需遍历数组数组:

for (String[] a : animal)
{
    for (int i = 0; i < a.length; i++)
        System.out.print(a[i] + ", ");
    System.out.println("");
}

答案 1 :(得分:1)

以下是执行此操作的代码 - 您可以将其剪切并粘贴到像eclipse这样的IDE中的Java项目中并运行它或将其放在file.java中并在命令行上编译并运行它。下一步是使其完全通用以获取任何输入,包括具有可变数量的列而没有预定最大值的行,并且不读取输入文件两次或将其作为数组或其他对象存储。

import java.io.File;
import java.io.FileNotFoundException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class BuildTableWithArrays {

    private static final String separator = "\\s+"; // regex for parsing lines
    private static final int rowWidth = 4;

    public static void main(String[] args) {

        Map<Integer, ArrayList<String>> columns = buildMapWithColumnArrayLists("animals.txt");
        printMap(columns);  // for demo
        // if you want actual arrays
        Map<Integer, String[]> colArrays = buildMapWithColumnArrays(columns);

    }

    public static Map<Integer, ArrayList<String>> buildMapWithColumnArrayLists(
        String fileName) {

        ArrayList<String> col0 = new ArrayList<String>();
        ArrayList<String> col1 = new ArrayList<String>();
        ArrayList<String> col2 = new ArrayList<String>();
        ArrayList<String> col3 = new ArrayList<String>();

        Map<Integer, ArrayList<String>> columns = new HashMap<Integer, ArrayList<String>>();
        columns.put(0, col0);
        columns.put(1, col1);
        columns.put(2, col2);
        columns.put(3, col3);

        File file = new File(fileName);
        try {
            Scanner input = new Scanner(file);
            while (input.hasNextLine()) {
                String[] line = input.nextLine().trim().replaceAll(separator, " ")
                    .split(separator);
                for (int i = 0; i < rowWidth; i++) {
                    if (line[i] == null) {
                        columns.get(Integer.valueOf(i)).add("null");
                    } else {
                        columns.get(Integer.valueOf(i)).add(line[i]);
                    }
                }
            }
            input.close();
        } catch (FileNotFoundException x) {
            System.out.println(x.getMessage());
        }

        return columns;
    }

    public static void printMap(Map<Integer, ArrayList<String>> columns) {

        for (int i = 0; i < rowWidth; i++) {
            System.out.println("col" + i + " #elements = "
                + columns.get(Integer.valueOf(i)).size());
            for (String s : columns.get(Integer.valueOf(i))) {
                System.out.print(s + " ");
            }
            System.out.println("\n");
        }
    }

    public static String[] convertArrayList2Array (ArrayList<String> arrayList) {

        String[] array = new String[arrayList.size()];
        array = arrayList.toArray(array);
        return array;

    }

    public static Map<Integer, String[]> buildMapWithColumnArrays(Map<Integer, ArrayList<String>> columns) {

        Map<Integer, String[]> cols = new HashMap<Integer, String[]>(); 

        for (Map.Entry<Integer, ArrayList<String>> entry : columns.entrySet()) {
            Integer key = entry.getKey();
            ArrayList<String> value = entry.getValue();
            String[] val = convertArrayList2Array(value);
            cols.put(key,val);
        }

        return cols;

    }

}

答案 2 :(得分:0)

如果输入文件的结构有保证,那么您可以使用扫描仪获取所需的数据。首先使用适当的类型声明所需的4个数组。

然后在你的while循环中使用:

  input.next()

获取字符串

  input.nextInt()

获取整数和

  input.nextDouble()

获得双倍价值。当然,您可以将这些值分配给相应的数组。