Я хотел бы сравнить объект с объектами, уже находящимися в очереди.
Я не уверен, должен ли я сделать инструмент Comparable для моего объекта или попытаться сравнить элементы перед их добавлением в очередь.Предметы будут данными от читателя, поэтому они будут поступать довольно быстро.Моя очередь имеет ограничение в 10000 элементов.Как только он достигнет максимума, он начнет удалять самый старый элемент.
Я начал расширять свой объект с помощью Comparable, но я не уверен, является ли PriorityQueue потокобезопасным.Итак, теперь я пытаюсь понять, могу ли я использовать функцию peek для поиска в очереди, но моя проблема в том, что мне нужно сравнить несколько полей в каждом объекте.Мне нужно посмотреть номер тега, дату и название устройства.Как лучше всего делать то, что мне нужно?Спасибо!
код из приведенного примера:
@Component
public class TagInfoComparator implements Comparator<TagInfo>{
@Override
public int compare(TagInfo tag1, TagInfo tag2) {
if(tag1.getEpc().equals(tag2.getEpc())){
if(tag1.getIpaddr().equals(tag2.getIpaddr())){
return tag1.getTimestamp().compareTo(tag2.getTimestamp());
}
return tag1.getIpaddr().compareTo(tag2.getIpaddr());
}
return tag1.getEpc().compareTo(tag2.getEpc());
}
}
Вот мой обновленный код для компаратора.У меня есть это:
public static PriorityBlockingQueue<TagInfo> TagBuffer2=new
PriorityBlockingQueue (10000, новый TagInfoComparator ());
в моем коде.Затем я говорю: TagBuffer2.add (tag);
Это ошибка, которую я получаю после этого.
java.lang.ClassCastException: com.rfidreader.async.model.TagInfo cannot be cast to java.lang.Comparable
at java.util.concurrent.PriorityBlockingQueue.siftUpComparable(PriorityBlockingQueue.java:357)
at java.util.concurrent.PriorityBlockingQueue.offer(PriorityBlockingQueue.java:489)
at java.util.concurrent.PriorityBlockingQueue.add(PriorityBlockingQueue.java:463)
at com.rfidreader.async.model.CSLReader.StartInventory(CSLReader.java:489)
at com.rfidreader.async.AsyncRfidpringApplication.lambda$4(AsyncRfidpringApplication.java:258)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Что я делаю не так?Спасибо!