这不是我刚才模拟的真实代码,以便了解下一步该做什么。
我有班级人物,年龄,身高体重
现在我的班组中
我创建了两个四个对象
Person programmer, student, clerk, tech;
我有HashMap rollCall
Map<Person, Integer> rollCall = new HashMap<Person, Integer>();
使用Person和人数添加所有这些作为Integer的类型
rollCall.put(programmer, 1);
rollCall.put(clerk, 2);
rollCall.put(student, 1);
rollCall.put(tech, 3);
我见过很多人使用TreeMap对HashMap进行排序,我希望对Person的属性进行排序而不是值。我想按照他们的年龄对所有这些人进行排序(即programmer.getAge();)。我不确定我是否会使用仅适用于收集而非地图的comprator。 。 请帮忙 ...
答案 0 :(得分:4)
您可以使用自定义比较器获得Map<Person,Integer>
按年龄增加或减少顺序进行迭代:
Map<Person, Integer> rollCall = new TreeMap<Person, Integer>(
new Comparator<Person>() {
@Override public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge(); // Acending.
// or p2.getAge() - p1.getAge(); // Descending.
}
}
);
当您将人物添加到集合中时,他们将按年龄顺序插入。
答案 1 :(得分:1)
首先,TreeMap
对键进行排序,而不是值。所以这已经对你有利了。您在TreeMap
中用作键的任何对象都必须实现Comparable
,或者您必须提供Comparator
作为构造函数参数。您需要做的就是使用compareTo()
方法(来自Comparable
)或compare()
方法(来自Comparator
)根据您的getAge()
属性进行比较。
描述了TreeMap
的{{1}}构造函数here. Comparator
将用于对地图中的键进行排序。
答案 2 :(得分:1)
您需要能够比较您的Person对象。如果有比较它们的规范方法,请让它们实现Comparable<Person>
(即给它们compareTo(Person)
方法。
如果这样做,您可以将人员用作SortedMap的键(如TreeMap)。
如果可以通过多种方式比较两个人,请将Comparator<Person>
作为单独的对象实施。
然后在构造中将此比较器提供给SortedMap。
这不会对你的HashMap进行排序(HashMap总是看似随机的顺序),而是给你另一个排序的数据结构。
答案 3 :(得分:0)
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class PersonSort {
private MySort sort = new MySort();
private Map<Person, String> map = new HashMap<Person, String> ();
private Map<Person, String> treeMap = new TreeMap<Person, String>(sort);
Person e1 = new Person(500, "Saurabh");
Person e2 = new Person(400, "Kishan");
Person e3 = new Person(900, "Ashwini");
public void myMap() {
map.put(e3, "Ash");
map.put(e2, "Krish");
map.put(e1, "Sau");
Iterator it = map.keySet().iterator();
System.out.println("UnSorted Map");
while(it.hasNext()) {
System.out.println(map.get(it.next()));
}
treeMap.putAll(map);
System.out.println("SortedMap");
Iterator it1 = treeMap.keySet().iterator();
while(it1.hasNext()) {
System.out.println(treeMap.get(it1.next()));
}
}
public static void main(String[] args) {
PersonSort es = new PersonSort();
es.myMap();
}
}
class Person {
Person(int id, String name) {
this.id = id;
this.name = name;
}
private int id;
private String name;
//Getters and Setters
}
class MySort implements Comparator<Object> {
public int compare(Object o1, Object o2) {
return ((Person) o1).getId() - ((Person)o2).getId();
}
}
答案 4 :(得分:-1)
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/*
* Sort HashMap that contains Student object
*/
public class SortHashMap implements Comparator<Student>
{
public static void main(String[] args)
{
Map map = new HashMap();
map.put("s1", new Student(5,"utpal"));
map.put("s2", new Student(4,"ramesh"));
map.put("s3", new Student(10,"tushar"));
map.put("s4", new Student(2,"anindya"));
Collection<Student> students = map.values();
List list = new ArrayList(students);
Collections.sort(list,new SortHashMap());
for (Iterator it = list.iterator(); it.hasNext();)
{
Student stdn = (Student)it.next();
System.out.println("Student id : "+stdn.id);
System.out.println("Student Name : "+stdn.name);
}
}
@Override
public int compare(Student s1, Student s2)
{
return s1.name.compareTo(s2.name);
}
}
class Student
{
int id;
String name;
Student(int id,String name)
{
this.id = id;
this.name = name;
}
}