我需要在找到最接近的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'。
如何实现这一目标?
提前致谢...
答案 0 :(得分:0)
在1.35
等上使用Math.round()
,然后使用结果在地图中查找条目。
这仅适用于地图包含所有可能整数的键,Math.round()
可以返回您的数据。如果不(例如,存在间隙),则HashMap
不是合适的数据结构。在这种情况下,您可以使用TreeMap
和ceilingEntry()
/ 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,然后添加这些值。