我是Java新手Comparators
有人可以通过比较键/值来帮助我创建Comparator
来比较LinkedHashmaps
吗?
答案 0 :(得分:3)
每个Map
(实际上,AbstractMap
的所有子类)已经以比较键/值对的方式实现了equals(..)
方法。
因此,如果使用Comparator
,您可以使用:
public int compare(Map first, Map second){
// appropriate null checks here
return first.equals(second) ? 0 : 1;
}
但我宁愿将Map
放入新的HashSet
,这会自动删除重复项:
Set<Map> uniqueMaps = new HashSet<Map>(listOfMaps);
答案 1 :(得分:2)
我会做这样的事情:(伪代码)
for(each entry in firstList) {
a=firstList.nextKey();
b=secondList.nextKey();
if(a != b !! firstList.get(a) != firstList.get(b))
return false;
}
return true;
但这意味着您正在使用对象标识(换句话说,每个对象在两个列表中必须是完全相同的对象)。
如果不是这种情况,则必须在可能位于任一列表中的每个对象中实现.equals,然后替换:
if(a != b ...
与
if(!a.equals(b)...
或类似的东西。
另外,正如有人在评论中所说的那样,有一个更好的方法可以解决你想要解决的问题。
答案 2 :(得分:1)
这是一个伪代码示例。它不处理空值(如果你愿意可以添加它)并比较Map和Map将不会有很大差异/困难:)。有一个测试用例,浪费了很多行来实际设置地图列表,但应该很容易理解。
package com.ekanathk;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
class MapEntryComparator implements Comparator<Map<String, String>> {
private String[] keysToCompare;
//What are the key columns you want to compare ???
public MapEntryComparator(String[] keysToCompare) {
this.keysToCompare = keysToCompare;
}
@Override
public int compare(Map<String, String> o1, Map<String, String> o2) {
for(String s: keysToCompare) {
//HANDLE NULLS if any
int comparison = o1.get(s).compareTo(o2.get(s));
if(comparison != 0) {
return comparison;
}
}
return 0;
}
}
public class ComparatorCheck {
@Test
public void testSimple() {
LinkedHashMap<String, String> m1 = getMapSample("X", "M", "C", "D");
LinkedHashMap<String, String> m2 = getMapSample("A", "B", "C", "D");
LinkedHashMap<String, String> m3 = getMapSample("A", "B", "C", "D");
LinkedHashMap<String, String> m4 = getMapSample("A", "B", "X", "D");
List<LinkedHashMap<String, String>> list = new ArrayList<LinkedHashMap<String,String>>();
list.add(m1);
list.add(m2);
list.add(m3);
list.add(m4);
MapEntryComparator comparator = new MapEntryComparator(new String[]{"k1", "k2", "k3"});
Collections.sort(list, comparator);
assertEquals(m2, list.get(0));
assertEquals(m3, list.get(1));
assertEquals(m4, list.get(2));
assertEquals(m1, list.get(3));
}
private LinkedHashMap<String, String> getMapSample(String v1, String v2, String v3, String v4) {
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
map.put("k1", v1);
map.put("k2", v2);
map.put("k3", v3);
map.put("k4", v4);
return map;
}
}