Java 按值按字母顺序排列HashMap
我有一个Java 按值按字母顺序排列HashMap,java,sorting,collections,Java,Sorting,Collections,我有一个HashMap,其中对象是学生的ID,学生是来自学生的对象 如何通过学生的名字使用HashMap,student->getName()?HashMap本质上是无序的,无法排序 相反,您可以使用实现,例如。 但是,即使是已排序的贴图也只能按其键进行排序 如果要按值排序,需要将它们复制到已排序的列表中。哈希映射不能按值排序。映射是为基于键的恒定时间查找而设计的,因此不需要按值排序。如果需要按名称排序,我建议使用SortedSet并创建一个按名称排序的比较器 class StudentComp
HashMap
,其中对象是学生的ID,学生是来自学生的对象
如何通过学生的名字使用HashMap,
student->getName()
?HashMap本质上是无序的,无法排序
相反,您可以使用实现,例如。但是,即使是已排序的贴图也只能按其键进行排序
如果要按值排序,需要将它们复制到已排序的列表中。哈希映射不能按值排序。映射是为基于键的恒定时间查找而设计的,因此不需要按值排序。如果需要按名称排序,我建议使用
SortedSet
并创建一个按名称排序的比较器
class StudentComparator implements Comparator<Student> {
int compare(Student s1, Student s2) {
return s1.getName().compareTo(s2.getName());
}
}
class StudentComparator实现Comparator{
整数比较(学生s1、学生s2){
返回s1.getName().compareTo(s2.getName());
}
}
如果同时需要固定时间查找和按值排序集,则可能需要维护映射和集 贴图不能按值排序。不过,您可以这样做:
Collection<Student> students = map.values();
Collection.sort(new ArrayList<Student>(students)), new Comparator<Student>() {
public int compare(Student s1, Student s2) {
return s1.getName().compareTo(s2.getName());
}
});
Collection students=map.values();
Collection.sort(新的ArrayList(students)),新的Comparator(){
公共整数比较(学生s1、学生s2){
返回s1.getName().compareTo(s2.getName());
}
});
当然,假设您需要迭代这些值。(不然你为什么要这样订购?)
祝你好运。我肯定会使用一个新类来存储密钥和对象 然后您可以将映射的每个元素以此类的形式放入ArrayList,最后使用比较器对ArrayList进行排序,然后您只需构建一个新映射。代码如下所示:
Map<Object, Student> valueMap = new LinkedHashMap<String, String>();
List<Student> pairValueList = new ArrayList<PairValue>();
PairValue p;
for (Map.Entry<Object, Student> entry : map.entrySet()) {
Object key = entry.getKey();
Student value = entry.getValue();
p = new PairValue(key, value);
pairValueList.add(p);
}
Collections.sort(pairValueList, new Comparator<PairValue>() {
@Override
public int compare(PairValue c1, PairValue c2) {
return c1.getLabel().compareTo(c2.getLabel());
}
});
for (PairValue pv : pairValueList) {
valueMap.put(pv.getValue(), pv.getStudent());
}
这就是我过去解决类似问题的方法。请注意,返回的映射实现需要是LinkedHashMap。您可能无法对HashMap进行排序,但您当然可以执行一些提供相同效果的操作。通过使用博客上发布的优秀代码,我可以按整数的降序对HashMap进行排序。同样的原则也适用于HashMap对象:
/*
*Java方法按值对Java中的映射进行排序,例如HashMap或Hashtable
*如果映射包含空值,则引发NullPointerException
*它还对值进行排序,即使它们是重复的
*/
公共静态映射SortByValue(映射映射){
列表条目=新的LinkedList(map.entrySet());
Collections.sort(条目,新的Comparator(){
@凌驾
公共整数比较(条目o1、条目o2){
返回o1.getValue().compareTo(o2.getValue());
//若要按字母顺序进行比较,不区分大小写,请返回以下内容
//o1.getValue().toString().compareToIgnoreCase(o2.getValue().toString());
}
});
//LinkedHashMap将按键插入的顺序保留键
//它目前是按自然顺序排序的
Map sortedMap=new LinkedHashMap();
对于(Map.Entry:entries){
sortedMap.put(entry.getKey(),entry.getValue());
}
返回分拣的DMAP;
}
要调用此方法,我使用:
Map<String, Integer> sorted = sortByValues(myOriginalHashMapObject);
Map sorted=sortByValue(myOriginalHashMapObject);
阅读更多内容:是的,我假设一个学生总是有一个名字,而且学生本身不是空的。这取决于家庭作业“希望”你做什么。由于没有“诉诸”,可能它希望您以特定顺序显示/导出学生(在HashMap中)。。。无论如何,家庭作业是变化无常的。重复,可能更多。这必须是Java十大问题之一。HashMap不提供自我排序的方法。因此,唯一的选择就是获取所需的视图并对视图进行排序。但是请注意,从视图中删除也会从HashMap中删除它自己的树映射。说地图总的来说不可能是完全准确的。是的,我知道OP说使用HashMap,但你说的是Map,不是HashMap。按键排序。我说的是按值排序,而不是按键排序。
/*
* Java method to sort Map in Java by value e.g. HashMap or Hashtable
* throw NullPointerException if Map contains null values
* It also sort values even if they are duplicates
*/
public static <K extends Comparable,V extends Comparable> Map<K,V> sortByValues(Map<K,V> map){
List<Map.Entry<K,V>> entries = new LinkedList<Map.Entry<K,V>>(map.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<K,V>>() {
@Override
public int compare(Entry<K, V> o1, Entry<K, V> o2) {
return o1.getValue().compareTo(o2.getValue());
// to compare alphabetically case insensitive return this instead
// o1.getValue().toString().compareToIgnoreCase(o2.getValue().toString());
}
});
//LinkedHashMap will keep the keys in the order they are inserted
//which is currently sorted on natural ordering
Map<K,V> sortedMap = new LinkedHashMap<K,V>();
for(Map.Entry<K,V> entry: entries){
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
Map<String, Integer> sorted = sortByValues(myOriginalHashMapObject);