diff --git a/app/src/main/java/ru/dragonestia/picker/repository/impl/collection/QueuedLinkedList.java b/app/src/main/java/ru/dragonestia/picker/repository/impl/collection/QueuedLinkedList.java index f77b8e5..bd842bd 100644 --- a/app/src/main/java/ru/dragonestia/picker/repository/impl/collection/QueuedLinkedList.java +++ b/app/src/main/java/ru/dragonestia/picker/repository/impl/collection/QueuedLinkedList.java @@ -2,14 +2,24 @@ package ru.dragonestia.picker.repository.impl.collection; import java.util.HashMap; import java.util.Map; +import java.util.function.Function; public class QueuedLinkedList { + private final Function selectorValidator; private Node first; private Node last; private Node cursor; private final Map> itemMap = new HashMap<>(); + public QueuedLinkedList() { + this(item -> true); + } + + public QueuedLinkedList(Function selectorValidator) { + this.selectorValidator = selectorValidator; + } + public void add(ITEM item) { if (itemMap.containsKey(item.getId())) return; @@ -77,11 +87,28 @@ public class QueuedLinkedList { if (cursor == null) cursor = first; + int rounds = 0; Node item = cursor; - while (item != null && item.removed) { + while(rounds < 1) { + while (item != null && item.removed) { + item = item.next; + } + + if (item == null) { + item = first; + rounds++; + continue; + } + + if (selectorValidator.apply(item.object)) { + break; + } + item = item.next; } - if (item == null) item = first; + if (rounds > 0) { + throw new RuntimeException("Cannot get need object because no one fulfills all the conditions"); + } cursor = item.next; return item.object; diff --git a/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java index e758e72..7a7180f 100644 --- a/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java +++ b/app/src/main/java/ru/dragonestia/picker/repository/impl/picker/RoundRobinPicker.java @@ -7,11 +7,13 @@ import ru.dragonestia.picker.repository.UserRepository; import ru.dragonestia.picker.repository.impl.collection.QueuedLinkedList; import java.util.Collection; +import java.util.concurrent.atomic.AtomicInteger; public class RoundRobinPicker implements RoomPicker { private final UserRepository userRepository; - private final QueuedLinkedList list = new QueuedLinkedList<>(); + private final AtomicInteger addition = new AtomicInteger(0); + private final QueuedLinkedList list = new QueuedLinkedList<>(wrapper -> wrapper.canAddUnits(addition.get())); public RoundRobinPicker(UserRepository userRepository) { this.userRepository = userRepository; @@ -38,7 +40,8 @@ public class RoundRobinPicker implements RoomPicker { synchronized (list) { try { - while (!(wrapper = list.pick()).canAddUnits(amount)); + addition.set(amount); + wrapper = list.pick(); } catch (RuntimeException ex) { throw new RuntimeException("There are no rooms available"); }