如何排序hashmap String,Collection <string [] =“”>&gt; by String [index] </string>

时间:2012-07-28 20:38:35

标签: java collections hashmap sorting

我想要排序这张地图:

Map<String, Collection<String[]>> map = new HashMap<String, Collection<String[]>>();

在地图中是例如:

String key = "MyKey";
Collection<String[]> values = new ArrayList<String[]>();
map.put(key, values);

String[] firstValues = { "John", "21", "M"};
values.add(firstValues); //Name, Age, Gender

String[] secondValues = { "Jane", "31", "W"};
values.add(secondValues);

所以最终,我有: 地图:

Mykey : [["John", "21", "M"], ["Eve", "31", "W"]];

我想做:

Collection<String[]> values = map.get(key);

然后按特定索引排序,例如按字母顺序排列第一个索引(名称),或者 按第二个指数(年龄)。所以在第一次排序后会是:

Mykey : [["Eve", "31", "W"], ["John", "21", "M"]];
第二次排序后

Mykey : [["John", "21", "M"], ["Eve", "31", "W"]];

2 个答案:

答案 0 :(得分:5)

您的代码在我看来就像开发人员在Ruby等动态语言中所经历的那样。您可能会发现这不是Java的最佳途径。您应该使用包含这些字符串的适当对象为String[]建模。

此外,我认为您的问题的地图部分不是很相关 - 您实际上正在处理需要按其中一个属性排序的对象集合。您碰巧在地图中有几个这样的集合不会影响解决方案。

排序本身是在@Havard Geithus已经建议你的情况下完成的。

答案 1 :(得分:3)

使用指定比较器的API java.util.Collections.sort(List list, Comparator c),并根据需要实现(一个用于名称,另一个用于年龄)

此外,不是使用String[]{name, age, gender}作为元素,而是创建一个将这些变量作为成员的类Person。我可能会把你想要的两个比较器放在这个类中:

public static final Comparator<Person> AGE_COMPARATOR = new Comparator<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        // implement
    }
};

现在你可以简单地调用

Collections.sort(map.get(key), Person.AGE_COMPARATOR);

假设您使用List接口而不是Collection接口作为@Vatev建议:

Map<String, List<Person>> map = new HashMap<String, List<Person>>();