我正在尝试使用Java从输入文件中读取问题实例的参数。
例如,假设问题由三个参数seasonality
,prices
和elasticity
定义,每个参数都是数组。
输入文件是否有标准文件格式?它可能看起来像下面那个,或者它可能有另一种标准格式。
seasonality
10 11 12 13 14 15
prices
10 9 8 7
elasticity
-4 2 1
是否有标准库或解析器会自动解析此类输入文件?
就我的目的而言,如果 Reader 类将每个参数的List
映射到参数值(可以是数组或标量),那将是完美的。
第二个类可以使用 Reader 类中定义的参数读取Reader类以创建问题实例。
答案 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;
}
}