如何将对象中的几个字段与对象队列进行比较?

时间:2019-01-15 23:20:57

标签: java queue comparator

我想将一个对象与队列中已有的对象进行比较。

我不确定是否应该将实现与我的对象进行比较,还是尝试在将项目添加到队列之前进行比较。这些项目将是来自阅读器的数据,因此这些项目将很快出现。我的队列限制为10,000个项目。一旦达到最大值,它将开始删除最旧的项目。

我开始使用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,new 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)

我在做什么错?谢谢!

0 个答案:

没有答案