这有点奇怪,因为我肯定对数据结构进行了过度设计。有更简单的方法可以简单地通过搜索来解决此问题。但是,我想知道是否存在一种更好的,更通用的方法来表达以下问题。谁知道呢,将来可能会派上用场。
假设您可以根据时间段,日期和时间安排工作班次。例如,“第二个星期二上午”是指计划在一个月的第二个星期二的一个凌晨。这三个都是枚举。 (第一,第二,第三,第四)(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的方式来表达我所缺少的方式。