Подход 1: Вы можете использовать TreeMap
и перебирать его ключи, и, если между двумя ключами есть пробел, вы можете вставить свой элемент в этот пробел. Добавление будет работать в O(currentKeysCount)
наихудшем случае, удаление будет работать в O(log(currentKeysCount))
.
private TreeMap<Integer, Track> tracks;
public Register() {
this.trains = new TreeMap<>();
}
public void addTrack(Track track) {
int id = 1;
for (int key : this.trains.keySet) {
if (key > id) break;
id = key + 1;
}
this.tracks.put(id, track);
}
public void removeTrack(int id) {
if (tracks.containsKey(id)) {
this.tracks.remove(id);
} else {
Terminal.printError("track with ID " + track.getId() + " doesn't exist.");
}
}
Подход 2: Вы можете создать PriorityQueue
, в котором будут храниться удаленные ключи. Добавление и удаление будут работать в O(log(currentKeysCount) + log(deletedKeysCount))
.
private Map<Integer, Track> tracks;
private PriorityQueue<Integer> deletedKeys;
private int nextKey;
public Register() {
this.trains = new HashMap<>();
this.deletedKeys = new PriorityQueue<>();
this.nextKey = 0;
}
public void addTrack(Track track) {
int id = nextKey;
if (!deletedKeys.isEmpty()) id = deletedKeys.poll();
this.tracks.put(id, track);
}
public void removeTrack(int id) {
if (tracks.containsKey(id)) {
this.tracks.remove(id);
this.deletedKeys.add(id);
} else {
Terminal.printError("track with ID " + track.getId() + " doesn't exist.");
}
}
Подход 3: Может быть намного проще игнорировать отсутствующие ключи и просто увеличивать счетчик nextKey
при каждом добавлении (вы можете даже используйте long
вместо int
). Если вы не добавляете новый ключ чаще, чем один раз в миллисекунду, ваша программа не выйдет из строя раньше, чем весь код, который использует System.currentTimeMillis()
(и он потерпит неудачу в течение более 292 миллионов лет). Добавление и удаление будет работать в O(log(currentKeysCount))