java - 封装数组的索引偏移访问的最快方法是什么?
问题描述
为了对大量计算进行建模,我需要将速度与代码编写者和读者的一些便利结合起来。
第一个重要部分是计算和存储按出生年份、性别、年龄等索引的数据。
例如我的出生年份范围是从 1900 到 2050。因为我不能声明一个从 1950 到 2050 的非零索引数组,所以我想封装从 [0..150] 到 [1900..2050] 的索引偏移。显然,它更不容易出错,更容易阅读和编写代码,例如
valueArray.setValue(1950, someValue);
比
valueArray[1950 - 1900] = someValue;
如果您必须使用多个不同的数组范围执行数百次。
速度对我的任务至关重要。所以我想知道有没有比下面显示的对我来说明显的更快的方法。你会采取完全不同的方法来解决这个问题吗?
public class OffsetArray {
private int min;
private int max;
private double initValue;
private double[] values;
public OffsetArray( int min, int max, double initValue ) {
this.min = min;
this.max = max;
this.values = new double[max-min+1];
this.initValue = initValue;
this.init();
}
private void init() {
for ( int i = 0; i<max-min+1;i++) {
values[i] = this.initValue;
}
}
public double getValue(int index) {
return values[index-min];
}
public void setValue(int index, double value ) {
this.values[index-min] = value;
}
public int getMin() {
return min;
}
public int getMax() {
return max;
}
编辑附加要求:
我需要这种具有多个维度且范围以负数开头的数组,即[-50..50]。
解决方案
为什么不使用 HashMap?它们非常有效,可以让你根据一个键“索引”。
Map<String, List<Integer>> map = new HashMap<>();
map.computeIfAbsent("1900-2000", k -> new ArrayList<>()).add(10);
map.computeIfAbsent("1900-2000", k -> new ArrayList<>()).add(20);
map.computeIfAbsent("1900-2000", k -> new ArrayList<>()).add(30);
System.out.println(map.get("1900-2000"));
您可以使用某种方法根据相关值(对象)的状态创建键。