Java 按属性而不是值对HashMap对象进行排序
这不是我为了理解下一步该做什么而模拟的真实代码。Java 按属性而不是值对HashMap对象进行排序,java,hashmap,Java,Hashmap,这不是我为了理解下一步该做什么而模拟的真实代码。 我有一个具有年龄、身高和体重的班级人员。 现在在我的班级小组 我创建了两个四个对象 Person programmer, student, clerk, tech; 我有HashMap rollCall Map<Person, Integer> rollCall = new HashMap<Person, Integer>(); 我见过很多人使用TreeMap按值对HashMap进行排序,我想按Person的属性排序
我有一个具有年龄、身高和体重的班级人员。
现在在我的班级小组
我创建了两个四个对象
Person programmer, student, clerk, tech;
我有HashMap rollCallMap<Person, Integer> rollCall = new HashMap<Person, Integer>();
我见过很多人使用TreeMap按值对HashMap进行排序,我想按Person的属性排序,而不是按值排序。我想根据年龄对所有这些人进行分类(即程序员.getAge();)。我不知道我是否会使用压缩机,它只在收集而不是地图上工作。
.
请帮忙。。。
.首先,
TreeMap
按键排序,而不是按值排序。这已经对你有利了。在TreeMap
中用作键的任何对象都必须实现compariable
,或者必须提供比较器作为构造函数参数。您只需根据getAge()
属性对compareTo()
方法(来自Comparable
)或compare()
方法(来自Comparator
)进行比较
描述了采用比较器的树映射
构造函数。将使用比较器对映射中的键进行排序。您需要能够比较Person对象。如果有一种比较它们的标准方法,让它们实现compariable
(即给它们一个comparieto(Person)
方法)
如果完成此操作,您可以将人员用作SortedMap(如TreeMap)的键
如果有多种方法可以比较两个人,则将比较器作为一个单独的对象实现
然后将此比较器交给构建中的已分类地图
这不会对HashMap进行排序(HashMap的顺序似乎总是随机的),而是提供另一个排序后的数据结构;
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;
}
}
导入java.util.Collection;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.HashMap;
导入java.util.Iterator;
导入java.util.LinkedList;
导入java.util.List;
导入java.util.Map;
/*
*对包含学生对象的HashMap进行排序
*/
公共类SortHashMap实现了Comparator
{
公共静态void main(字符串[]args)
{
Map Map=newhashmap();
地图放置(“s1”,新生(5,“utpal”);
地图放置(“s2”,新生(4,“ramesh”);
地图放置(“s3”,新生(10,“图萨”);
地图放置(“s4”,新生(2,“anindya”);
Collection students=map.values();
列表=新数组列表(学生);
Collections.sort(list,new SortHashMap());
for(Iterator it=list.Iterator();it.hasNext();)
{
Student stdn=(Student)it.next();
System.out.println(“学生id:+stdn.id”);
System.out.println(“学生姓名:“+stdn.Name”);
}
}
@凌驾
公共整数比较(学生s1、学生s2)
{
返回s1.name.compareTo(s2.name);
}
}
班级学生
{
int-id;
字符串名;
学生(整数id,字符串名称)
{
this.id=id;
this.name=名称;
}
}
您可以通过使用自定义比较器获得一个映射图,该映射图按年龄递增或递减顺序进行迭代:
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.
}
}
);
Map rollCall=newtreemap(
新比较器(){
@覆盖公共整数比较(人员p1、人员p2){
返回p1.getAge()-p2.getAge();//结束。
//或p2.getAge()-p1.getAge();//降序。
}
}
);
将人员添加到集合时,他们将按年龄顺序插入。import java.util.Comparator;
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();
}
}
导入java.util.HashMap;
导入java.util.Iterator;
导入java.util.Map;
导入java.util.TreeMap;
公共类个人体育{
private MySort sort=new MySort();
私有映射Map=newhashmap();
私有映射树映射=新树映射(排序);
人员e1=新人员(500,“Saurabh”);
人员e2=新人员(400,“基山”);
人员e3=新人员(900,“Ashwini”);
公共void myMap(){
地图放置(e3,“灰烬”);
map.put(e2,“Krish”);
地图放置(e1,“Sau”);
迭代器it=map.keySet().Iterator();
System.out.println(“未分类地图”);
while(it.hasNext()){
System.out.println(map.get(it.next());
}
树地图(地图);
System.out.println(“SortedMap”);
迭代器it1=treeMap.keySet().Iterator();
while(it1.hasNext()){
System.out.println(treeMap.get(it1.next());
}
}
公共静态void main(字符串[]args){
PersonSort es=新PersonSort();
es.myMap();
}
}
班主任{
Person(int-id,字符串名){
this.id=id;
this.name=名称;
}
私有int-id;
私有字符串名称;
//接球手和接球手
}
类MySort实现了Comparator{
公共整数比较(对象o1、对象o2){
return((Person)o1.getId()-((Person)o2.getId();
}
}
请看这里:恐怕没有简单的方法。请看上面Overbose的链接。(我认为下面的一些答案假设您想按键排序(Person
)是的,我想按键排序而不是按值显示我可以按地图排序吗?我有一个类似的问题,但我需要按值排序。我不愿意弄乱我的Person类。在这种情况下,我必须创建一个新的Comprator类并使用Compare(Object o1,Object o2)方法。但这里的问题是Comprator只对集合而不是映射起作用??有没有办法使用Comprator for TreeMap?有什么例子吗?我在上面的回答中添加了一个指向我提到的构造函数的链接。这个构造函数将一个比较器作为参数,并使用它来比较键。
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();
}
}