6

上一节课

class Employee {
    int id;
    String name;
}

和一张包含此对象值的地图

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

现在我想对上面map的一个基础进行排序Employee's name。意味着当我使用 迭代此地图时Map.EntryEmployee对象必须按字母顺序检索。

提前致谢

4

3 回答 3

3

使用此构造函数将TreeMap与自定义Comparator一起使用:

http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html#TreeMap(java.util.Comparator)

于 2013-03-21T07:43:34.103 回答
3

您无法对 a 进行排序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带有额外开销的 a 会更简单。如果你只需要一次排序,你可以使用HashMap上面的代码。

于 2013-03-21T07:52:56.690 回答
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;
    }
}

有关解决方案,请参阅上面的链接。

感谢所有有回复的人。

于 2013-03-21T11:07:44.240 回答