Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按值按字母顺序排列HashMap_Java_Sorting_Collections - Fatal编程技术网

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