如何将HashMaps与不同的密钥进行比较?

时间:2011-04-05 12:10:58

标签: java

我有一个聚类算法,将聚类存储在HashMap<String, ArrayList<String>>

我需要将它与存储在另一个HashMap<String, ArrayList<String>>中的基本事实进行比较。

密钥不一样,因为数组是通过增量聚类创建的,所以我想知道如何将原始聚类与生成的聚类进行比较。

我正在使用NMI和BCUBED作为集群评估措施,但我的问题是如果它们有不同的密钥,如何引用同一个集群(ArrayList)。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我不是100%清楚你的班级如何设置以及HashMap<String, ArrayList<String>>是如何工作的,但我倾向于你应该有你的钥匙哈希。因此,当您分配群集时,您可以执行类似的操作。

原始数据:

Hashmap<String, ArrayList<String>> = key: Array Of Original Data

您可以将每个群集中的内容存储为以下函数:

HashMap<String, ArrayList<String>> = Cluster Key: Array of Original Data Keys

这将为您提供一种机制来循环遍历每个集群中的对象并仍然保持原始对象的状态,这是否有意义?然后你最终能够写出类似于:

的东西
for(String clusterKey : clusterMap.keySet()){
    for(String itemKey : clusterMap.get(clusterKey)){
       calculateDistance(centroid, originalMap.get(itemKey);
    }
}

这是一个粗略的过度简化,但应该让你朝着正确的方向前进。

修改 我还要求群集本身有一个质心的HashMap。因此,calculateDistance()方法可以重写为calculateDistance(centroidMap.get(clusterKey), originalMap.get(itemKey));

答案 1 :(得分:0)

我猜你可以创建一个反向HashMap,其中KeyObj是一个带有ArrayList和计数器的新对象。

在反向HashMap中,键的计数器将是相等的ArrayLists的数量。

现在比较算法很简单: 迭代第一个HashMap的值并搜索该值作为新HashMap的键。如果找到密钥并且计数器为0,或者找不到密钥,则返回false。否则,请计数 - 并继续下一次迭代。 最后,返回true。