首页 > 解决方案 > 对Hashmap中具有Null值的对象列表进行排序

问题描述

我必须根据对象内的 hashMap 值对对象进行排序。该对象类似于: Employee[getId, getName, getAge properties:{index,height, weight etc.}] 我想根据 hashmap 中可用的 Index 值对 Employee 进行排序。而对于索引值 Null 可能会在某个时候出现,所以我也需要处理。

我正在尝试以下代码进行排序:

Comparator<GNode> com = Comparator.comparing(Employee::getProperty(Constans.INDEX), Comparator.nullsFirst(Comparator.naturalOrder()));

但这会给编译时错误。

Employee 类是这样的:

public class Employee  
{
private UUID id;
private String name;
private int age;

public Employee(UUID id, String name, int age)
{
    this.id = id;
    this.name = name;
    this.age = age;
}

public UUID getId()
{
    return id;
}

public void setId(UUID id)
{
    this.id = id;
}

public String getName()
{
    return name;
}

public void setName(String name)
{
    this.name = name;
}    

public int getAge()
{
    return age;
}

public void setAge(int age)
{
    this.age = age;
}    
public Object getProperty(String key) {
    return properties.get(key);
}

public Object getProperty(String key, Object defValue) {
    Object ret = properties.get(key);
    return  (ret != null) ? ret : defValue;
}

public void addProperty(String key, Object value) {
    properties.put(key, value);
}
}     

请帮我解决这个问题。
非常感谢您提前

标签: javaalgorithmsortingdata-structurescollections

解决方案


你可以创建一个 Comparator 的实现并制定你的规则,我做了一个例子。

package com.ramiresmoreira;

import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;

public class Employee {
private UUID id;
private String name;
private int age;

public Employee(UUID id, String name, int age) {
    this.id = id;
    this.name = name;
    this.age = age;
}

public UUID getId() {
    return id;
}

public void setId(UUID id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public static void main(String[] args) {
    //Employee with name equal null
    Employee e1 = new Employee(UUID.randomUUID(), "Name 1", 22);
    Employee e2 = new Employee(UUID.randomUUID(), null, 19);
    Set<Employee> employees = new HashSet<>();
    employees.add(e1);
    employees.add(e2);
    List<Employee> sorted = employees.stream().sorted(new EmployeeSortNullFirst()).collect(Collectors.toList());
    System.out.println(sorted);
}

@Override
public String toString() {
    return "name=" + name ;
}
}

class EmployeeSortNullFirst implements Comparator<Employee> {

@Override
public int compare(Employee e1, Employee e2) {
    if(e1 == null ||  e2 == null) {
        return 1;
    }
    return Integer.compare(getHash(e1), getHash(e2));
}

private int getHash(Employee e) {
    return hashAge(e) + hasName(e) + hashId(e);
} 

private int hasName(Employee e) {
    return e.getName() != null ? e.getName().hashCode() : Integer.MAX_VALUE;
}

private int hashAge(Employee e) {
    return e.getAge();
}

private int hashId(Employee e) {
    return e.getId() != null ? e.getId().hashCode() : Integer.MAX_VALUE;
}
}

推荐阅读