我知道我可以使用TreeMap对Map进行排序,但我不知道如何按值排序,其中id是ArrayList的第一个索引。
以下是代码:
public void sort()
{
Map<String, ArrayList<String>> m = new TreeMap<String,ArrayList<String>>();
String[] name = new String[]{"first name", "second name", "third name"};
String[] description = new String[]{"first description", "second description", "third description"};
String[] id = new String[]{"1", "2", "3"};
m.put(name[0], new ArrayList<String>(Arrays.asList(new String[]{description[0], id[0]})));
m.put(name[1], new ArrayList<String>(Arrays.asList(new String[]{description[1], id[1]})));
m.put(name[2], new ArrayList<String>(Arrays.asList(new String[]{description[2], id[2]})));
}
我试过这个来对地图进行排序:
SortedSet<Map.Entry<String, ArrayList<String>>> sortedset = new TreeSet<Map.Entry<String, ArrayList<String>>>(
new Comparator<Map.Entry<String, ArrayList<String>>>()
{
public int compare(Entry<String, ArrayList<String>> o1, Entry<String, ArrayList<String>> o2)
{
// return Integer.valueOf(o1.getValue()[1]).compareTo(Integer.valueOf(o2.getValue()[1]));
return 0;
}
});
答案 0 :(得分:1)
TreeMap accepts a custom comparator也。您需要创建一个自定义Comparator并在TreeMap中将其传递为:
// assuming you create mycomparator
Map<String, ArrayList<String>> m = new TreeMap<String,ArrayList<String>>(mycomparator);
答案 1 :(得分:0)
你的问题有点令人困惑。 TreeMap
由键自然“排序”(好吧,当你遍历它时,它会显示为有序)。
如果要按值中的第一项排序,则需要使用值中的第一项作为键,或者将所有值复制到可排序的集合中,例如, ArrayList
,然后使用自定义Comparator
排序,比较每个数组的第一个元素。
您还可以使用TreeSet
与自定义Comparator
比较每个数组中的第一项。然后将所有数组插入TreeSet
。
您可能还需要考虑使用数据作为字段而不是并行数组创建自定义类。然后该类可以实现Comparable
,您可以按原样将其集合插入TreeSet
,例如:
public class Item implements Comparable<Item> {
private final String id;
private String name;
private String description;
public Item (String id) {
this.id = id;
}
@Override public int compareTo (Item item) {
// not shown for simplicity: check item, id, item.id for null.
return id.compareTo(item.id);
}
}
... {
TreeSet<Item> items = new TreeSet<Item>();
items.add(new Item(...));
items.add(new Item(...));
items.add(new Item(...));
// items will be naturally sorted by item id.
}
在上面的示例中,您希望id
为final
,以便在id
位于集合中时无法更改Item
,从而破坏了集合。
答案 2 :(得分:0)
您应该实现简单的类来保存信息然后使用集合,很容易对其进行排序并管理值。 然后使用Map对象,使用ID作为键,Map将自动排序,您可以使用自定义比较器按其他值对Map进行排序。
示例类
public class Obj{
final int ID;
String desctiption, name;
public Obj(int _ID){
ID=_ID;
}
/**
* @return the iD
*/
public int getID() {
return ID;
}
/**
* @param iD the iD to set
*/
public void setID(int iD) {
ID = iD;
}
/**
* @return the desctiption
*/
public String getDesctiption() {
return desctiption;
}
/**
* @param desctiption the desctiption to set
*/
public void setDesctiption(String desctiption) {
this.desctiption = desctiption;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
}
如果你想使用自定义比较器,你的类应该实现Comparable
接口,然后使用这样的东西
SortedSet<Map.Entry<int, Obj>> sortedset = new TreeSet<Map.Entry<int, Obj>>(
new Comparator<Map.Entry<int, Obj>>()
{
public int compare(Entry<int, Obj> o1, Entry<int, Obj> o2)
{
return o1.getValue().compareTo(o2.getValue());
}
});