如何将多个参数映射为HashMap中的键?

时间:2015-03-16 00:34:59

标签: java hashmap

在我的具体情况下,我想自动缓存修改过的图像 - 我的程序会做一些计算机视觉。为此,它经常重新采样图像以降低分辨率。这加快了识别速度,同时对我的算法精度几乎没有影响(如果有的话)。但这是一个普遍的问题。

我想要一个包含一个值的多个键的哈希映射。像这样:

//Map images by width and height
protected HashMap<(Integer, Integer), BufferedImage> resampled_images;

当然,上面的语法无效。一种糟糕的方法是将参数连接到字符串:

protected HashMap<String, BufferedImage> resampled_images;
...
//Some function that resamples and caches the resampled versions
public BufferedImages getResampled(int new_width, int new_height, boolean cache) {
  ...
  resampled_images.put(new_width+"X"+new_height, resampled_me);
}

只有整数参数我觉得它会很好用。但有些情况我需要通过更复杂的结构进行索引 - 而且大多数情况下它会再次缓存函数结果。图像处理非常昂贵。

3 个答案:

答案 0 :(得分:2)

Pair<A,B>班怎么样:

class Pair<A,B>{
    A first;
    B second;
}

然后创建HashMap<Pair<Integer,Integer>,BufferedImage>

编辑:

在您的特殊情况下,实现它的最简单方法是使用基元类型(int)。您还可以实现hashCode()equals(Object)方法,以便HashMap可以使用它们。

public class Pair{
    int x,y;

    public Pair(int x,int y){
        this.x = x;
        this.y = y;
    }

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + x;
        result = prime * result + y;
        return ((x + y) << 234234) % 21354205;
    }

    public boolean equals(Object o){
        if(o instanceof Pair){
            Pair p = (Pair) o;
            return p.x == x && p.y == y;
        }else{
            return false;
        }
    }
}

使用eclipse生成hashCode()方法。

答案 1 :(得分:1)

您可以使用以下方案。

Map<height, width> m1;
Map<width, BufferedImage> m2;

允许您创建关键别名。

这样我相信你可以拥有一个值(BufferedImage),与高度和宽度等多个键相关联。

使用BufferedImage,

m1.put(height,width);
m2.put(width, BufferedImage);

要使用BufferedImage,

m2.get(m1.get(height)); 

答案 2 :(得分:0)

编辑: 您可以使用java.awt.Dimension对象(或您定义的其他对象)来存储高度和宽度;

protected HashMap<Dimension, BufferedImage> resampled_images;

例如:

resampled_images.put(new Dimension(width, height), image);