Как сравнить несколько полей в объекте с очередью объектов? - PullRequest
0 голосов
/ 16 января 2019

Я хотел бы сравнить объект с объектами, уже находящимися в очереди.

Я не уверен, должен ли я сделать инструмент 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)

Что я делаю не так?Спасибо!

...