封装数组的索引偏移量访问的最快方法是什么?

时间:2019-06-01 22:48:02

标签: 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]。

1 个答案:

答案 0 :(得分:0)

为什么不使用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"));

您可能有一些方法可以根据所讨论的值(对象)的状态来创建密钥。