首页 > 解决方案 > 以元组为键的Java映射,通过元组键删除/获取

问题描述

我有一个场景,我希望有一个以元组为键的排序映射:

var scheduledRunnables = new TreeMap<Tuple<Integer, String>, Runnable>(Comparator.comparing(Tuple::getKey));

添加时,我想添加一个元组:

scheduledRunnables.put(new Tuple<>(order, taskName), task);

排序时,我希望它按顺序整数排序,因为这决定了可运行文件的执行顺序。我不一定知道变量的值taskName。调用时get,我只想提供订单整数,原因与前面所述相同。打电话时put,我想考虑整对。所以是这样的:

scheduledRunnables.put(new Tuple<>(1, "Some task"), () -> System.out.println("asdf"));
scheduledRunnables.get(1).run(); // Should output 'asdf'
scheduledRunnables.put(new Tuple<>(1, "Some task"), () -> System.out.println("qwerty"));
scheduledRunnables.get(1).run(); // Should output 'qwerty'
scheduledRunnables.remove(1).run(); // Should output 'qwerty' and remove from map

该类Tuple只是一个看起来像这样的数据持有者:

@Data
public class Tuple<K, V> {

    private final K key;
    private V value;

    public Tuple(K key, V value) {
        this.key = key;
        this.value = value;
    }

}

这将如何实施?是否可以不自定义实现 SortedMap 接口?有没有更好的方法来实现我所追求的?

标签: javatreemap

解决方案


老实说,只需维护两张地图。

Map<Integer, Runnable> idToRunnable;
Map<Integer, String> idToName;

或者使用元组作为值而不是键:

Map<Integer, Tuple<String, Runnable>>

推荐阅读