首页 > 解决方案 > 封装数组的索引偏移访问的最快方法是什么?

问题描述

为了对大量计算进行建模,我需要将速度与代码编写者和读者的一些便利结合起来。

第一个重要部分是计算和存储按出生年份、性别、年龄等索引的数据。

例如我的出生年份范围是从 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]。

标签: java

解决方案


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

您可以使用某种方法根据相关值(对象)的状态创建键。


推荐阅读