【问题标题】:Sort Hashmap<String, ArrayList> in Android [duplicate]在Android中排序Hashmap <String,ArrayList> [重复]
【发布时间】:2015-04-18 03:26:54
【问题描述】:

如何通过键对包含arraylist的hashmap进行排序?还要对arraylist进行排序吗?

Hashmap<String, ArrayList<Events>> h = new HashMap<>();
ArrayList<Events> a = new ArrayList<>();
a.add(new Events("1", "name1", "Address1"));
a.add(new Events("2", "name2", "Address2"));
h.put("10-12-2014", a);
h.put("08-11-2014", a1);

... ...

现在我想根据键进行排序。 并且还需要根据ID对每个key的ArrayList进行排序。

【问题讨论】:

    标签: java sorting collections hashmap


    【解决方案1】:

    使用TreeMap 代替HashMap,它会根据键的自然顺序自动排序。

    要对ArrayList 进行排序,请使用静态Collections#sort(List, Comparator) 方法,指定一个比较器来对列表中的Events 对象进行排序。例如,假设您要按名为idEvents 构造函数的第一个参数进行排序,那么您将调用sort,如下所示:

    Map<String, List<Events>> h = new HashMap<>();
    List<Events> a = new ArrayList<>();
    a.add(new Events("1", "name1", "Address1"));
    a.add(new Events("2", "name2", "Address2"));
    
    Collections.sort(a, new Comparator<Events>() {
    
        @Override
        public int compare(Events o1, Events o2) {
           return o1.getId().compareTo(o2.getId());
        }
    });
    h.put("10-12-2014", a);
    
    ... // similarly for list a1
    Collections.sort(a1, new Comparator<Events>() {
    
        @Override
        public int compare(Events o1, Events o2) {
           return o1.getId().compareTo(o2.getId());
        }
    });
    h.put("08-11-2014", a1);
    

    请注意,最好将列表和映射变量声明到接口,而不是实现,即声明h 的类型为Map 而不是HashMap,而a 的类型为List

    或者,考虑将Events 元素放入TreeSet 而不是ArrayList,并让Events 类实现Comparable 接口:

    class Events implements Comparable<Events> {
       private String id;
       ...
    
       @Override
       public int compareTo(Events o) {
          return this.getId().compareTo(o.getId());
       }
    }
    

    【讨论】:

    • 那么如何以最好的方式对arraylist进行排序?
    【解决方案2】:

    要对ArrayList进行排序,让Events实现Comparable(在compareTo函数中简单比较两个ID),可以通过Collections.sort(a)进行排序;

    我不确定我是否正确理解了您的 HashMap 问题,但正如 manouti 所说,我会使用 TreeMap(HashMap 通常根据定义未排序)

    【讨论】:

      【解决方案3】:

      简单的例子:

          TreeMap<String,ArrayList<String>> list = new TreeMap<>();
          ArrayList<String> l1 = new ArrayList<>();
          l1.add("hallo");
          l1.add("hello");
          l1.add("yoow");
      
          ArrayList<String> l2 = new ArrayList<>();
          l2.add("byee");
          l2.add("yooo");
          l2.add("daag");
      
          list.put("h", l1);
          list.put("e", l2);
      
          for (String s : list.keySet()){
              Collections.sort(list.get(s));
              System.out.println(list.get(s));
          }
      

      这个例子是字符串,但是如果你在你的对象中实现 Comparable 接口,它应该像这个例子一样工作:-)

      【讨论】:

        【解决方案4】:

        在 Java 集合中使用自定义排序。尝试为您的 POJO 实现 Comparator 或 Comparable 接口并调用 Collection 的本机排序方法。对于您的查询,我正在编写以下代码以对自定义数组列表进行排序以获取更多详细信息,请使用解决方案中的链接:-

        public class student {
        
            private String name = "";
            private int age = 0;
        
            public void setAge(int age) {
                this.age = age;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public int getAge() {
                return age;
            }
        
            public String getName() {
                return name;
            }
        
            @Override
            public boolean equals(Object obj) {
                if (obj == null) {
                    return false;
                }
                if (getClass() != obj.getClass()) {
                    return false;
                }
                final student other = (student) obj;
                if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
                    return false;
                }
                if (this.age != other.age) {
                    return false;
                }
                return true;
            }
        
            @Override
            public int hashCode() {
                int hash = 7;
                hash = 59 * hash + (this.name != null ? this.name.hashCode() : 0);
                hash = 59 * hash + this.age;
                return hash;
            }
        }
        
        player class :-
        
        package pojocomparator.mypack;
        
        import java.io.Serializable;
        import java.util.Comparator;
        
        public class player implements Comparator<player>{
        
            private int age = 0;
            private String name = "";
            private student stud = null;
        
            public player()
            {
        
            }
            public void setAge(int age) {
                this.age = age;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public int getAge() {
                return age;
            }
        
            public String getName() {
                return name;
            }
        
             public void setStud(student stud) {
                this.stud = stud;
            }
        
            public student getStud() {
                return stud;
            }   
        
            /*
             * compare method of Comparator<E> interface used for        comparing object of classes.
             * particularly called by "sort" method of Collections interface
             * @return int
             * @param Class objects for comparison
             */
            @Override
            public int compare(player o1, player o2) {
                return o1.age<o2.age ? -1 :
                        o1.age == o2.age ? 0 : 1;
                /*
                 * If first object is smaller than second then -1 is returned
                 * If first object is equal to second then 0 is returned
                 * else 1 is returned.
                 */
            }
        
        }
        
        
        import java.util.ArrayList;
        import java.util.Collections;
        import java.util.List;
        
        public class CallAll {
        
            public static void main(String... q)
            {
                //Generic List of Player class type
                List<player> playerList = new ArrayList<player>();
        
                player p1 =  new player();
                p1.setAge(21);
                p1.setName("vaibhav");
        
                player p2 =  new player();
                p2.setAge(18);
                p2.setName("anvesh");
        
                player p3 =  new player();
                p3.setAge(28);
                p3.setName("rohit");
        
                playerList.add(p1);
                playerList.add(p2);
                playerList.add(p3);
        
                /* Below statement is responsible for sorting playerList. This statement 
                 * internally calls compare method of Comaparator interface
                 */
                Collections.sort(playerList, new player());
        
                for(int i=0; i<playerList.size(); i++)
                {
                    System.out.println(playerList.get(i).getAge());
                }
        
                // inserting student type object into player type object
                student s1 = new student();
                s1.setName("mickey mouse");
                s1.setAge(15);
                p3.setStud(s1);
        
                // retrieval of student type data from player type data
                System.out.println("Student name : "+p3.getStud().getName());
                System.out.println("Student age : "+p3.getStud().getAge());
            }
        }
        

        给出输出:-

        运行:

        18

        21

        28

        学生姓名:米老鼠

        学生年龄:15 岁

        构建成功(总时间:6 秒)

        详情请看这里:- http://letslearnjava.quora.com/Plain-Old-Java-Object-classes-POJO-Base-for-game-development-EJB-Hibernate-JPA

        【讨论】:

          【解决方案5】:

          按照manouti 的建议,使用TreeMap 以便于对keys 进行排序

          对于值,只需遍历它们

              for(Entry<String,List> entry : h.entrySet()){
                 ArrayList<Event> a = entry.getValue();
                 Collections.sort(entry.getValue());
                 h.put(entry.getKey(), a);  //replaces the old value with its sorted value
              }
          

          【讨论】:

            猜你喜欢
            • 2017-06-01
            • 2015-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多