用于存储元素的数据结构,并按其使用频率/时间戳的顺序对它们进行排序



我有一个问题陈述:假设有一个Employee类,必须设计一个类,它提供get和put方法来访问和添加员工。Employee类是第三方类,所以我们不能对其进行更改。有一个内存限制,比如最多可以存储5万名员工。现在,如果在添加员工时达到内存限制,则通过以下任何一种方法删除一个员工并添加新员工:

    基于接入频率的
  1. 基于时间戳。带有旧时间戳的应该被删除

我可以考虑使用两个hashmap:一个用于存储员工对象,另一个用于存储员工的键和时间戳或频率作为值。

但这不是最优解。

请提供有价值的建议,说明可以使用哪种数据结构来解决这个问题。

仅使用普通集合来存储Employee。在添加新员工并且检测到内存已满时,只需确定具有最小排序顺序标准的员工并将其从数据库中删除。

由于没有提供Employee类,我在这里声明一个示例:

class Employee {
    int frequency;
    Instant lastAccess;
}
你的数据库(也可以是LinkedList):
private List<Employee> myDatabase = new ArrayList<>();

使用最小标准评估员工的比较器(比较第一个频率,如果等于最后一个access):

public int compare( Employee emp1, Employee emp2 )
{
    int result = emp1.frequency - emp2.frequency;
    if ( result == 0 )
    {
        result = emp1.lastAccess.compareTo( emp2.lastAccess );
    }
    return result;
}

这里的'main'方法插入一个新员工到你的数据库(isMemoryFull的实现留给你):

private void insertEmp( Employee emp)
{
    if ( isMemoryFull() )
    {
        Employee minEmp = myDatabase.stream().min( this::compare ).get();
        myDatabase.remove( minEmp);
    }
    myDatabase.add( emp );
}

注意:这适用于Java8 lambda和streams。对于java <你必须将比较方法正式地实现为Comparator,并使用Collections。使用stream().min()方法进行排序。>

最新更新