当前位置: 首页 > 知识库问答 >
问题:

从PriorityQueue中删除带有时间戳的项

夔修伟
2023-03-14

我使用的是一个优先级队列(java.util.priorityqueue ),其中需要以先进先出的方式处理具有相同优先级的项。

我通过将一个时间戳成员添加到要添加到队列中的项目中来处理这个问题,每个添加的项目都会增加这个时间戳成员。(请参见PriorityQueue具有相同优先级的对象和http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/PriorityBlockingQueue.html)

因此使用我拥有的文档中的FIFOEntry类

 class FIFOEntry<E extends Comparable<? super E>>
     implements Comparable<FIFOEntry<E>> {
   final static AtomicLong seq = new AtomicLong();
   final long seqNum;
   final E entry;
   public FIFOEntry(E entry) {
     seqNum = seq.getAndIncrement();
     this.entry = entry;
   }
   public E getEntry() { return entry; }
   public int compareTo(FIFOEntry<E> other) {
     int res = entry.compareTo(other.entry);
     if (res == 0 && other.entry != this.entry)
       res = (seqNum < other.seqNum ? -1 : 1);
     return res;
   }
 }

我现在想做的是能够确定一个项目是否在队列中,并且/或者能够从队列中移除一个项目。我不能直接使用containsremove函数,因为队列保存的是FIFOEntry对象,而不是eojects。

创建一个新的、单独的类,它有一个成员用于entry(相同的类型E),并将equals()函数移动到另一个类中,这样会更好吗?那用比较器来代替呢?

附注。更多上下文:这是要在Android中使用的。

共有1个答案

诸葛阳成
2023-03-14

如果您为e类(条目)正确地重写hashcodecompareToequals,那么一切都将正常工作。

上面的fifoEntry类是composity的一个示例。

您可以重写equals方法,如下所示。

@Override public boolean equals(Object o){
   if(!(o instanceof FIFOEntry)){
      return false;
   }
   FIFOEntry cp= (FIFOEntry) o;
   return cp.entry.equals(entry) && cp.seqNum.equals(seqNum);
}
import java.util.Iterator;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.atomic.AtomicLong;

public class Test123 {
    public static void main(String[] args) {
        E x = new Test123.E(1);
        PrivateBlockingQueue queue = new Test123.PrivateBlockingQueue();
        FIFOEntry<E> e1 = new Test123.FIFOEntry<E>(x);
        FIFOEntry<E> e2 = new Test123.FIFOEntry<E>(new E(2));
        FIFOEntry<E> e3 = new Test123.FIFOEntry<E>(new E(1));

        queue.add(e1);
        queue.add(e2);
        queue.add(e3);

        System.out.println(queue.contains(x));
        while (true) {
            FIFOEntry<E> t = queue.poll();
            if (t == null) {
                break;
            }
            if (t.equals(e1)) {
                System.out.println("hi this is E1");
                System.out.println(t.compareTo(e1));
            }
            System.out.println(t.getEntry().getInt() + " " + t.seqNum);
        }

    }

    @SuppressWarnings("serial")
    static class PrivateBlockingQueue extends
            PriorityBlockingQueue<FIFOEntry<E>> {
        public boolean contains(E o) {
            Iterator<FIFOEntry<E>> itr = iterator();
            while (itr.hasNext()) {
                FIFOEntry<E> x = itr.next();
                if (x.entry.equals(o)) {
                    return true;
                }
            }
            return false;
        }
    }

    static class E implements Comparable<E> {
        final private Integer xyz;

        public E(int e) {
            this.xyz = e;
        }

        public Integer getInt() {
            return xyz;
        }

        @Override
        public boolean equals(Object obj) {
            if (!(obj instanceof E)) {
                return false;
            }
            E test = (E) obj;
            return test.getInt() == xyz;
        }

        @Override
        public int compareTo(E o) {
            if (xyz < o.getInt()) {
                return -1;
            }
            if (xyz > o.getInt()) {
                return 1;
            }
            return 0;
        }
    }

    static class FIFOEntry<E extends Comparable<? super E>> implements
            Comparable<FIFOEntry<E>> {
        final static AtomicLong seq = new AtomicLong();
        final long seqNum;
        final E entry;

        public FIFOEntry(E entry) {
            seqNum = seq.getAndIncrement();
            this.entry = entry;
        }

        public E getEntry() {
            return entry;
        }

        public int compareTo(FIFOEntry<E> other) {
            int res = entry.compareTo(other.entry);
            if (res == 0 && other.entry != this.entry)
                res = (seqNum < other.seqNum ? -1 : 1);
            return res;
        }

        @Override
        public boolean equals(Object o) {
            if (!(o instanceof FIFOEntry)) {
                return false;
            }
            @SuppressWarnings("rawtypes")
            FIFOEntry cp = (FIFOEntry) o;
            return cp.entry.equals(entry) && cp.seqNum == seqNum;
        }
    }
}

编辑

根据检查priorityqueue中是否存在类e以及维护equals和compareTo一致性的要求,您可以扩展和重载contains(以及将调用equals的其他地方),检查上面的代码段(编辑过)。

 类似资料:
  • 问题内容: 场景: 我有一个从Excel工作表中检索到具有多个列的数据框。其中一些列是日期:一些仅包含日期(yyyy:mm:dd),一些具有日期和时间戳(yyyy:mm:dd 00.00.000000)。 问题: 当日期不是数据框的索引时,如何从日期中删除时间戳? 我已经尝试了什么: 在SO的其他文章中使用pandas中的日期- 在datetime中删除看不见的字符并转换为字符串以及如何剥离pan

  • 问题内容: 我读了外汇DataFrame的Pandas更改时区,但我想让我的数据框时区的time列幼稚,以便与sqlite3数据库实现互操作性。 我的pandas数据框中的数据已经转换为UTC数据,但是我不想在数据库中维护此UTC时区信息。 给定其他来源的数据样本,它看起来像这样: 给出: 但 给出最终错误: 如何用时区天真的时间戳替换列? 问题答案: 该列必须是dtype,例如from的使用,然

  • 返回我女巫是错误的。 但接下来的查询如下: 我看对日期

  • 问题内容: 我想从数据库中的特定表中删除所有时间戳超过180天的行。 我已经试过了: 但这会删除所有行,而不仅仅是删除六个月以上的行。 我在on_search表中有一列称为search_date,其中包含创建该行的时间。 问题答案:

  • 有可能移除这个吗?或者甚至只是移动它,说到文件的末尾? 我注意到了其他类似的问题,但只是针对HTML(或即时通讯不生成的RTF)而不是PDF