我有一个表格,其中包含一些我需要合并到Java程序中的因素。起初我正在考虑对数字进行硬编码,但尝试创建适合这些因素的数据结构似乎很痛苦。所以我想问一下,看看在数据库,平面文件或java中实现它作为参考数据是否更好。该数字将每六个月更改一次,并将用于数学计算。
思想?
答案 0 :(得分:3)
对于像这样的缓慢变化的数据,我会使用外部配置文件。根据您的数据结构,似乎CSV可以正常运行,并且业务用户可以轻松地使用Excel进行编辑。
如果它会更频繁地更改,您需要以编程方式生成数据,或者您想提供用于编辑数据的UI,您可以将其移动到数据库。
答案 1 :(得分:1)
您可以将其表示为XML,但对于此类数字数据可能有点重。但XML将允许您进行相当描述性和自我记录。然后,您可以轻松地将其解析为Java(或您选择的其他语言)。
部分XML示例:
<dataset>
<gd>
<16to21>
<single>
<male>1.10</male>
<female>1.20</female>
</single>
<married>
<male>0.90</male>
<female>0.80</female>
</married>
</16to21>
...
</gd>
<ngd>
...
</ngd>
答案 2 :(得分:1)
无论您如何存储数据,都必须创建一个包含数据的数据结构。但是这种数据的数据结构不一定非常复杂。它只是一个包含属性的值列表。您不必将它们存储在类似于表的复杂结构中。
将数据表示为单个列表时,从平面文本文件加载数据也非常容易。
public class DataTable {
private List<Entry> table = new ArrayList<Entry>();
public double getValue(Sex sex, MaritalStatus maritalStatus, AgeInterval ageInterval, Type type) {
for (Entry entry : table) {
if (entry.sex == sex && entry.maritalStatus == maritalStatus && entry.ageInterval == ageInterval && entry.type == type) {
return entry.value;
}
}
throw new IllegalArgumentException("Unknown value");
}
public void load(String filename) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
String line;
while ((line = reader.readLine()) != null) {
StringTokenizer t = new StringTokenizer(line, ":");
table.add(new Entry(
Sex.valueOf(t.nextToken()),
MaritalStatus.valueOf(t.nextToken()),
AgeInterval.valueOf(t.nextToken()),
Type.valueOf(t.nextToken()),
Double.valueOf(t.nextToken())));
}
} catch (IOException e) {
throw new IllegalStateException("Failed to read the data file", e);
}
}
}
enum Sex {M, F}
enum MaritalStatus {SINGLE, MARRIED}
enum AgeInterval {I16_21, I22_35, I35_55, I55}
enum Type {GD, NGD} // Whatever this is ...
class Entry {
Sex sex;
MaritalStatus maritalStatus;
AgeInterval ageInterval;
Type type;
double value;
Entry(Sex sex, MaritalStatus maritalStatus, AgeInterval ageInterval, Type type, double value) {
this.sex = sex;
this.maritalStatus = maritalStatus;
this.ageInterval = ageInterval;
this.type = type;
this.value = value;
}
}
数据文件如下所示:
M:SINGLE:I16_21:GD:1.10
F:SINGLE:I16_21:GD:1.20
...
答案 3 :(得分:0)
您可以分解字段的一种方法是性别,年龄,marital_status,GD_VS_NGD,表格中的数据以及您使用此数据的时间段的某些标识符,除非您不需要保留记录数据。