【问题标题】:Sorting HashMap objects on their properties rather values [duplicate]根据其属性而不是值对HashMap对象进行排序[重复]
【发布时间】:2011-09-09 17:19:21
【问题描述】:

这不是我刚刚模拟的真实代码,以便了解下一步该做什么。

我有具有年龄、身高体重属性的人。
现在在我的班组
我创建了两个四个对象

Person programmer, student, clerk, tech;

我有 HashMap rollCall

Map<Person, Integer> rollCall = new HashMap<Person, Integer>();

使用 Person 和 Number of Persons 作为 Integer 类型添加所有这些

rollCall.put(programmer, 1);
rollCall.put(clerk, 2);
rollCall.put(student, 1);
rollCall.put(tech, 3);

我看到很多人使用 TreeMap 根据值对 HashMap 进行排序,我想根据 Person 的属性而不是值进行排序。我想按年龄对所有这些人进行排序(即programmer.getAge();)。我不确定我是否会使用仅适用于集合而不适用于地图的比较器。 . 请帮忙 ... .

【问题讨论】:

  • 恐怕没有简单的方法。查看上面 Overbose 的链接。(我认为下面的一些答案假设您想对键进行排序(Person)。)
  • 是的,我想对键而不是值进行排序
  • 如何为 Map 排序。我有一个类似的问题,但我需要对值进行排序。

标签: java hashmap


【解决方案1】:

首先,TreeMap 按键排序,而不是值。所以这已经对你有利。您在TreeMap 中用作键的任何对象必须实现Comparable,或者您必须提供Comparator 作为构造函数参数。您需要做的就是根据您的getAge() 属性比较您的compareTo() 方法(来自Comparable)或compare() 方法(来自Comparator)。

采用ComparatorTreeMap 构造函数被描述为here. Comparator 将用于对映射中的键进行排序。

【讨论】:

  • 我不愿意弄乱我的 Person 类。在这种情况下,我必须创建一个新的 Comprator 类并使用 Compare(Object o1, Object o2) 方法。但这里的问题是 Comprator 只适用于集合而不是地图?有没有办法将比较器用于 TreeMap ?有什么例子吗?
  • 我添加了一个链接到我在上面的答案中提到的构造函数。此构造函数将Comparator 作为参数,并使用它来比较键。
【解决方案2】:

您需要能够比较您的 Person 对象。如果有比较规范的方法,让他们实现Comparable&lt;Person&gt;(即给他们一个compareTo(Person) 方法。

如果这样做了,您可以将人员用作 SortedMap(如 TreeMap)的键。

如果有多种方法可以比较两个人,请将 Comparator&lt;Person&gt; 实现为单独的对象。

然后将这个比较器交给 SortedMap 进行构造。

这不会对您的 HashMap 进行排序(HashMap 总是具有看似随机的顺序),而是为您提供另一个排序的数据结构。

【讨论】:

    【解决方案3】:
    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;
        }    
    }
    

    【讨论】:

      【解决方案4】:

      您可以获得Map&lt;Person,Integer&gt;,它使用自定义比较器按年龄递增或递减顺序进行迭代:

      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.
          }
        }
      );
      

      当您将 Persons 添加到集合中时,它们将按年龄顺序插入。

      【讨论】:

        【解决方案5】:
        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();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-04-06
          • 2023-03-15
          • 2017-07-18
          • 2018-11-14
          • 2017-09-06
          • 2021-07-14
          • 2020-09-22
          • 2012-10-22
          • 1970-01-01
          相关资源
          最近更新 更多