根据Object的成员变量对HashMap进行排序

时间:2013-03-21 07:31:08

标签: java sorting collections hashmap

有一个班级

class Employee {
    int id;
    String name;
}

和一个包含此对象的地图

Map<Integer, Employee> map = new HashMap<Integer, Employee>();

现在我想在map的基础上排序Employee's name以上。表示当我使用Map.Entry迭代此地图时,Employee对象必须按字母顺序翻译。

提前致谢

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

您无法对HashMap进行排序,但您可以使用entrySet()对其条目进行排序。

public class MapSort {
    private static class Employee {
        public String name;

        public Employee(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
           return name;
        }
    }

    public static void main(String[] args) {
        Map<Integer, Employee> map = new HashMap<Integer, Employee>();

        map.put(1, new MapSort.Employee("x"));
        map.put(2, new MapSort.Employee("a"));
        map.put(3, new MapSort.Employee("f"));

        List<Map.Entry<Integer, Employee>> entryList = new ArrayList<Map.Entry<Integer, Employee>>(map.entrySet());

            Collections.sort(
                    entryList, new Comparator<Map.Entry<Integer, Employee>>() {
                @Override
                public int compare(Map.Entry<Integer, Employee> integerEmployeeEntry,
                                   Map.Entry<Integer, Employee> integerEmployeeEntry2) {
                    return integerEmployeeEntry.getValue().name
                            .compareTo(integerEmployeeEntry2.getValue().name);
                }
            }
        );

        System.out.println(entryList);
    }
}

排序后,您可以将您的条目放回支持排序的地图中,例如LinkedHashMap

这取决于您的使用案例:如果您需要始终对地图进行排序,则使用带有额外开销的TreeMap会更简单。如果您只需要进行一次排序,则可以使用HashMap和上述代码。

答案 2 :(得分:1)

Michaël提出了一个Sort a Map<Key, Value> by values (Java)的链接。我做了一些改变。它适用于我

class ValueComparator implements Comparator<Integer> {

    Map<Integer, Employee> base;
    public ValueComparator(Map<Integer, Employee> base) {
        this.base = base;
    }

    // Note: this comparator imposes orderings that are inconsistent with equals.    
    public int compare(Integer a, Integer b) {
        return ((Employee)base.get(a)).compareTo(base.get(b));
    }

}

class Employee implements Comparable {
    public String name;
    public int id;

    Employee(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public int compareTo(Object obj) {
        return this.name.compareTo(((Employee)obj).name);
    }

    public String toString() {
        return name;
    }
}

对于解决方案,请参考上面的维度链接。

感谢所有有回复的人。