如何使用对象值</string>对HashMap <string,object =“”>进行排序

时间:2014-07-04 07:04:50

标签: java sorting spring-mvc comparator

我在通过我的应用程序应用排序机制时遇到了麻烦。

原因有时排序不准确,java中的比较器对我来说仍然不清楚,但我已经在这里和那里使用了排序。

现在,目前的问题如下。

我有

HashMap<String, ModelX.ContactModel> unsortedModelContacts = 
new HashMap<String,ModelX.ContactModel>(contacts.size());

之后,我发现了 contactlist并使用for循环我将值设置如下:

unsortedModelContacts.put(stringvalue, modelContact); 
//object having name , and other details

如何对unsortedModelContacts排序modelContact.getName属性进行排序?

2 个答案:

答案 0 :(得分:1)

SortedMap<String,ModelX.ContactModel> sortedModelContacts = new TreeMap<>();

for( ModelX.ContactModel modelContact: contactlist ){ // same list as before
     sortedModelContacts.put( modelContact.getName(), modelContact);
}

您现在可以按名称属性的排序顺序访问此地图的条目。

注意:这假定名称是唯一的。如果不是这样,您将不得不使用多图或

Map<String,ModelX.Set<ContactModel>>

并相应地修改put和其他访问。

答案 1 :(得分:1)

如果您的地图密钥与名称字段不同,那么您可以考虑使用此方法。写一个单独的比较器

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import sample.ModelX.ContactModel;


public class SortMapSample {
    public static void main(String[] args) throws Exception {
        Map<String, ModelX.ContactModel> unsortedModelContacts = new HashMap<String,ModelX.ContactModel>(10);

        unsortedModelContacts.put("1", new ModelX.ContactModel("James"));
        unsortedModelContacts.put("2", new ModelX.ContactModel("Mary"));
        unsortedModelContacts.put("3", new ModelX.ContactModel("John"));
        unsortedModelContacts.put("4", new ModelX.ContactModel("Amanda"));
        unsortedModelContacts.put("5", new ModelX.ContactModel("Charles"));

        System.out.println(sortMap(unsortedModelContacts));
    }

    private static Map<String, ModelX.ContactModel> sortMap(
            Map<String, ModelX.ContactModel> unsortedMap) {

        List<Entry<String, ModelX.ContactModel>> list = new LinkedList<Entry<String, ModelX.ContactModel>>(
                unsortedMap.entrySet());

        Collections.sort(list,
                new Comparator<Entry<String, ModelX.ContactModel>>() {

                    @Override
                    public int compare(Entry<String, ContactModel> o1,
                            Entry<String, ContactModel> o2) {
                        return o1.getValue().getName().compareTo(o2.getValue().getName());
                    }
                });

        Map<String, ModelX.ContactModel> sortedMap = new LinkedHashMap<String, ModelX.ContactModel>();
        for(Entry<String, ModelX.ContactModel> item : list){
            sortedMap.put(item.getKey(), item.getValue());
        }
        return sortedMap;
    }

}