Java的标准输入文件格式和解析器?

时间:2013-12-22 23:27:09

标签: java file-io

我正在尝试使用Java从输入文件中读取问题实例的参数。 例如,假设问题由三个参数seasonalitypriceselasticity定义,每个参数都是数组。 输入文件是否有标准文件格式?它可能看起来像下面那个,或者它可能有另一种标准格式。

seasonality
10 11 12 13 14 15
prices
10 9 8 7
elasticity
-4 2 1

是否有标准库或解析器会自动解析此类输入文件?

回应评论的澄清

就我的目的而言,如果 Reader 类将每个参数的List映射到参数值(可以是数组或标量),那将是完美的。 第二个类可以使用 Reader 类中定义的参数读取Reader类以创建问题实例。

2 个答案:

答案 0 :(得分:1)

对于此问题,我建议使用Map<String,List<Integer>和您展示的示例格式。在输入文件上打开Scanner,阅读String作为密钥,然后阅读int s直到用完为止。重复直到EOF。

答案 1 :(得分:1)

根据chrylis的回答,我创建了一个类来解析这些文件,每个参数和值用空格分隔。

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

/**
 * Read an input file which has multiple parameters, where the
 * name of each is a string not equal to a number, and is followed
 * by the a scalar or array of integers or doubles.
 * Each parameter and number is separated by white space.
 */
public class NumberParser {

    public static Map<String, Object> parse(String file) throws Exception {
        Scanner scanner = new Scanner(new File(file));

        Map<String, Object> map = new HashMap<String, Object>();

        while (scanner.hasNext()) {
            String parameter = scanner.next();

            if (scanner.hasNextInt()) {
                List<Integer> list = new LinkedList<Integer>();
                while (scanner.hasNextInt()) {
                    list.add(scanner.nextInt());
                }
                map.put(parameter, listToIntArray(list));
            } else { // double array
                List<Double> list = new LinkedList<Double>();
                while (scanner.hasNextDouble()) {
                    list.add(scanner.nextDouble());
                }
                map.put(parameter, listToDoubleArray(list));
            }
        }

        scanner.close();

        return map;
    }

    private static int[] listToIntArray(List<Integer> list) {
        int[] array = new int[list.size()];
        int i = 0;
        for (Iterator<Integer> itr = list.iterator(); itr.hasNext(); ++i) {
            array[i] = itr.next();
        }
        return array;
    }

    private static double[] listToDoubleArray(List<Double> list) {
        double[] array = new double[list.size()];
        int i = 0;
        for (Iterator<Double> itr = list.iterator(); itr.hasNext(); ++i) {
            array[i] = itr.next();
        }
        return array;
    }

}