0

我想对这张地图进行排序:

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"]];
4

2 回答 2

5

在我看来,您的代码就像是 Ruby 等动态语言经验丰富的开发人员编写的代码。您可能会发现这不是您使用 Java 的最佳途径。您应该String[]使用包含这些字符串作为属性的适当对象来建模。

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

排序本身是按照@Havard Geithus 已经建议您的那样完成的。

于 2012-07-28T21:01:51.963 回答
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 接口而不是 @Vatev 建议的 Collection 接口:

Map<String, List<Person>> map = new HashMap<String, List<Person>>();
于 2012-07-28T20:47:59.770 回答