java - 对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);
}
}
请帮我解决这个问题。
非常感谢您提前
解决方案
你可以创建一个 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;
}
}
推荐阅读
- angular - 如何将服务中的值传递到引导程序上模块的 forRoot() 中?
- java - UI 签名并注册所有片段。启动时出错
- python - 为什么会得到意想不到的 dict
- jquery - 关注jquery的变化
- c++ - 使用索引几何增强多边形
- pyspark - PySpark 并行读取多个文件
- objective-c - 应用程序因 Objective-C 中的错误“Invalid pointer dequeued from free list”而崩溃
- python - Python pandas从左表和右表中获取左表中缺少的行
- kops - 当我为 kops apiVersion 指定错误名称时没有错误,发生了什么?
- python - 'Host Unreachable' 返回成功