有没有一种自然的方法可以将多个键映射到带有隐含键的单个值?

时间:2019-08-21 04:02:14

标签: java dictionary data-structures

这有点奇怪,因为我肯定对数据结构进行了过度设计。有更简单的方法可以简单地通过搜索来解决此问题。但是,我想知道是否存在一种更好的,更通用的方法来表达以下问题。谁知道呢,将来可能会派上用场。

假设您可以根据时间段,日期和时间安排工作班次。例如,“第二个星期二上午”是指计划在一个月的第二个星期二的一个凌晨。这三个都是枚举。 (第一,第二,第三,第四)(M,T,W,Th,F)(AM,PM)。我忽略了一个月中的第5个工作日,因为它发生的时间不一致,因此我只能模仿用例的第3个工作日程。

我正在移动班次,并希望有一个数据结构可以快速找到在特定...预定查询中安排的所有班次。通过查询,我的意思是“键”的任意组合。例如,我可以找到在星期一安排的所有班次,或者在第三个星期五安排的所有班次,或者在星期四下午的所有班次等。

现在比较棘手的是,某些班次仅由例如Day定义。因此,如果将此班次移至星期一,则它应出现在涉及星期一的任何查询中。我知道我可以将这样的转变分解为一堆小转变,并将它们安排在所有可能的位置,但是在我的领域中对此有一些限制,出于争论的目的,让我们说这是不可能的。 / p>

我尝试了以下操作:

public class ShiftFinder {

    private final Map<ShiftFinderKey, List<Shift>> finder;

    public ShiftFinder(List<Provider> providers) {
        this.finder = new HashMap<>();
        for (Slot s : Slot.values()) {
            finder.putIfAbsent(new ShiftFinderKey(s, null, null), new ArrayList<>());
            for (Day d : Day.values()) {
                finder.putIfAbsent(new ShiftFinderKey(s, d, null), new ArrayList<>());
                finder.putIfAbsent(new ShiftFinderKey(null, d, null), new ArrayList<>());
                for (Time t : Time.values()) {
                    finder.putIfAbsent(new ShiftFinderKey(s, d, t), new ArrayList<>());
                    finder.putIfAbsent(new ShiftFinderKey(s, null, t), new ArrayList<>());
                    finder.putIfAbsent(new ShiftFinderKey(null, d, t), new ArrayList<>());
                    finder.putIfAbsent(new ShiftFinderKey(null, null, t), new ArrayList<>());
                }
            }
        }
    }

    public List<Shift> find(ShiftFinderKey key) {
        return finder.get(key);
    }

    public void put(Shift shift) {
        List<ShiftFinderKey> keys = shift.getKeys();
        for (ShiftFinderKey key : keys) {
            finder.get(key).add(shift);
        }
    }

    public void remove(Shift shift) {
        List<ShiftFinderKey> keys = shift.getKeys();
        for (ShiftFinderKey key : keys) {
            finder.get(key).remove(shift);
        }
    }
}

虽然可行,但存在一个大问题。放置和移除可能很慢,尤其是当我使用较大数量的“键”时。例如,假设有s档,d天和t时间。该移位将具有2(s + t + s * t)键,并且对于每个键都必须在列表或集合上执行添加或删除。

一个想法是我拥有一个嵌入式DBMS,但我主要是想弄清楚是否存在一种自然的类似于Java的方式来表达我所缺少的方式。

0 个答案:

没有答案