如何在java中找到集合之间的最近值?

时间:2014-09-17 08:13:48

标签: java collections

我需要在找到最接近的Arraylist值后从Hashmap中找到密钥。

我有一个如下的Hashmap:

HashMap<Integer,ArrayList> map=new HashMap<Integer,ArrayList>;
map.put(1,new ArrayList(0.45,0.55));
map.put(2,new ArrayList(1.45,1.55));
map.put(3,new ArrayList(3.45,3.55));

而且,我有一个Arraylist:

ArrayList checklist=new ArrayList();
checklist.add(1.35);
checklist.add(1.60);

现在我需要将清单与Hashmap的值(即Arraylist)进行比较。

如果我比较上面两个集合,可能我会从hashmap中获得密钥'2'。

如何实现这一目标?

提前致谢...

4 个答案:

答案 0 :(得分:0)

1.35等上使用Math.round(),然后使用结果在地图中查找条目。

这仅适用于地图包含所有可能整数的键,Math.round()可以返回您的数据。如果不(例如,存在间隙),则HashMap不是合适的数据结构。在这种情况下,您可以使用TreeMapceilingEntry() / floorEntry()

答案 1 :(得分:0)

从地图计算每个List的平均值,然后与清单中的平均值进行比较。

获取最小Math.abs(avgCheckList-avgMapItem);

的地图条目

答案 2 :(得分:0)

使用正确的模板参数化,这将使您的生活更轻松。

Map<Integer, List<Double>> map = new HashMap<Integer, List<Double>>();
map.put(1, new ArrayList<Double>() {{add(0.45); add(0.55);}});
map.put(2, new ArrayList<Double>() {{add(1.45); add(1.55);}});
map.put(3, new ArrayList<Double>() {{add(3.45); add(3.55);}});

List<Double> checklist = new ArrayList<Double>();
checklist.add(1.35);
checklist.add(1.60);

然后计算清单值和地图中数组列表值之间的差异,找到最小值,就是那个。

答案 3 :(得分:0)

这个怎么样:

double min = Double.MAX_VALUE;
Integer index;

Set<Integer> keys = map.keySet();
Iterator it = keys.iterator();

while(it.hasNext())
{
    Integer key = it.next();
    double dist = distance( map.get(key), checklist);
    if( dist < min )
    {
        min = dist;
        index = key;
    }
}

然后变量索引具有您想要的值。方法距离返回您的首选距离度量。看起来你可以使用1-norm:

public double distance(ArrayList<Double> a1, ArrayList<Double> a2)
{
    if(a1.size() != a2.size())
        return Double.MAX_VALUE;

    double sum = 0.0;
    for(int i=0; i<a1.size(); i++)
        sum += Math.abs(a1.get(i)-a2.get(i));

    return sum;
}

此外,始终参数化您的ArrayList:

ArrayList<Double> checklist=new ArrayList<Double>();

new ArrayList(0.45, 0.55)

会给你一个错误。我假设你真正想做的是创建ArrayList,然后添加这些值。