我想要排序这张地图:
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"]];
答案 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>>();