我想将一个对象与队列中已有的对象进行比较。
我不确定是否应该将实现与我的对象进行比较,还是尝试在将项目添加到队列之前进行比较。这些项目将是来自阅读器的数据,因此这些项目将很快出现。我的队列限制为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)
我在做什么错?谢谢!