可以比较LinkedHashMap的比较器

时间:2010-03-31 21:22:10

标签: java

我是Java新手Comparators

有人可以通过比较键/值来帮助我创建Comparator来比较LinkedHashmaps吗?

3 个答案:

答案 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;
    }
}