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 rollCall

Map<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();
    }
}