简体   繁体   中英

Sort LinkedHashMap using Comparable based on object attribute

I want to sort a LinkedHashMap based on object attribute and using Comparable. Here is my code:

public class MapClass{

    public static void main(String args[]){
        sortMapBasedOnValueObjectUsingComprable();
    }

     public static void sortMapBasedOnValueObjectUsingComprable(){

        Map map = new LinkedHashMap();
        map.put("2",new Pojo("456"));
        map.put("4",new Pojo("366"));
        map.put("1",new Pojo("466"));
        map.put("8",new Pojo("5666"));
        map.put("9",new Pojo("456"));
        map.put("3",new Pojo("66"));

        // How to sort ...?



        Set<Map.Entry<String,Object>> st = map.entrySet();
        Iterator itr = st.iterator(); 
        while(itr.hasNext()){
            Map.Entry mxt= (Map.Entry)itr.next();
            Pojo pj = (Pojo)mxt.getValue();
            System.out.println(pj.getX());
        } 
     }



public class Pojo implements Serializable,  Comparable<Object>{

    private static final long serialVersionUID = 1L;
    private String x;

    public String getX() {
        return x;
    }
    public void setX(String x) {
        this.x = x;
    }
    public Pojo(String x) {
        super();
        this.x = x;
    }
    @Override
    public int compareTo(Object o) {
        return 0;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((x == null) ? 0 : x.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Pojo other = (Pojo) obj;
        if (x == null) {
            if (other.x != null)
                return false;
        } else if (!x.equals(other.x))
            return false;
        return true;
    }



}

So u need to first dump your entrySet into a List and then sort it.You can't sort a set unless you are using a TreeSet.I will prefer to dump it into a List which implements RandomAccess so that I can fetch any element by its index.

Map<String,Object> map = new LinkedHashMap<>();

Set<Map.Entry<String,Object>> st = map.entrySet();

List<Map.Entry<String,Object>> listSort = new ArrayList<>(st);

Collections.sort(listSort,new Comparator<Map.Entry<String,Object>(){

public int compare(Map.Entry<String,Object> entry1,Map.Entry<String,Object> entry2){

  return ((Comparable)entry1.getValue).compareTo(entry2.getValue.compareTo);

});



Just iterate the list and you can get the elements sorted 

Note:- I have implemented a Comparator using anonymous inner class and this Comparator in turn uses the Comparable instance of Pojo class

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM