在map< string,list< person>>的值中维护person的有序子级

w7t8yxp5  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(354)
public interface Person {
    String getName();
    Integer getOrder();
    String getId();
}  
public class HeavyPerson implements Person {
    @Override
    public String getName() {
        return "heavyPerson";
    }
    @Override
    public Integer getOrder() {
        return 2;
    }
    @Override
    public String getId() {
        return "Transport";
    }
}

public class LightPerson implements Person {
    @Override
    public String getName() {
        return "lightPerson";
    }
    @Override
    public Integer getOrder() {
        return 1;
    }
    @Override
    public String getId() {
        return "Transport";
    }
}

public class PersonEvaluator {

// map containing id and all its implementation
// Here "transport" id have LightPerson and HeavyPerson implementation.
Map<String, Set<Person>> persons = new HashMap<>();

// How to store set which have sorting based on order.
public void addPerson(Person person) {
    if (!persons.containsKey(person.getId())) {
        persons.put(person.getId(), new HashSet<>());
    }
    persons.get(person.getId()).add(person);
}

public void execute() {
    // TODO execute person based on order. For key "Transport" from map the 
    // values should be taken out in order.
    // order 1 should be executed first
    // order 2 should be executed next.
    }
}

在这里,我想以有序的方式将person的实现存储在map值中。实现定义了顺序(像一些按顺序执行的过滤器)。
我可以做的一件事是使用treeset代替hashset,但在这种情况下,所有实现都需要实现排序(比较逻辑),这是一种开销,因为对于所有实现,排序总是固定的。
如何做到这一点有什么建议吗?

2w3rbyxf

2w3rbyxf1#

如果你不想 *Person 要实现的类 Comparable ,您可以简单地定义 Comparator 把它传给 TreeSet 施工单位:

private static final Comparator<Person> personCmp = (p1, p2) -> {
    return Integer.compare(p1.getOrder(), p2.getOrder());
};

public void addPerson(Person person) {
    if (!persons.containsKey(person.getId())) {
        persons.put(person.getId(), new TreeSet<>(personCmp));
    }
    persons.get(person.getId()).add(person);
}

相关问题