根据某些条件从 PriorityQueue 中移除不同类型的 Item
Removing different types of Items from PriorityQueue according to some conditions
我正在尝试检查名为 interLinks
和 intraLinks
的优先队列结构中的两种链接。根据下面的方法 URLremoveCondition()
,我尝试从我的 PQueue
中删除所有这两种 URL 链接 interLinks
和 intraLinks
如果它们达到 MaxWaitTime
我将其设置为 10 Seconds
该方法将删除这些链接。
但问题是方法 URLremoveCondition()
仅从 PQueue
中删除 interLinks
而没有删除 intraLinks
。如何解决此问题以删除 interLinks
和 intraLinks
?
这是我的方法URLremoveCondition()
public static PriorityQueue <LinkNodeLight> PQueue = new PriorityQueue <> ();
private static Integer MaxWaitTime = new Integer (10000); // 10 Seconds
public void URLremoveCondition() {
synchronized (PQueue) {
Iterator<LinkNodeLight> iterator = PQueue.iterator();
while(iterator.hasNext()){
LinkNodeLight URL = iterator.next();
long URLWaitingTime = System.currentTimeMillis() - URL.enqueTime.getMillis();
if(URLWaitingTime > MaxWaitTime){
iterator.remove();
System.out.println("DELETED NODE: " + URL.url + " WAITTIME: " + Long.toString(URLWaitingTime));
}
}
}
}
这是我的 class LinkNodeLight
:
import org.joda.time.DateTime;
public class LinkNodeLight implements Comparable<LinkNodeLight> {
protected String url;
protected float weight;
protected DateTime enqueTime;
protected boolean interLinks;
public String getUrl() {
return url;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
}
public DateTime getEnqueTime() {
return enqueTime;
}
public LinkNodeLight(String url) {
this.url = url;
}
public boolean isInterLinks() {
return interLinks;
}
public void setInterLinks(boolean interLinks) {
this.interLinks = interLinks;
}
public void setEnqueTime(DateTime enqueTime) {
this.enqueTime = enqueTime;
}
@Override
public int compareTo(LinkNodeLight link) {
if (this.weight < link.weight) return 1;
else if (this.weight > link.weight) return -1;
return 0;
}
}
编辑:
我在这里创建 interLinks
和 intraLinks
import java.util.LinkedList;
import java.util.List;
public class URLWeight {
public static List<LinkNodeLight> weight(LinkNode sourceLink, List<LinkNodeLight> links) {
List<LinkNodeLight> interLinks = new LinkedList<>();
List<LinkNodeLight> intraLinks = new LinkedList<>();
for (LinkNodeLight link : links) {
if (isIntraLink(sourceLink, link)) {
intraLinks.add(link);
link.setInterLinks(false);
} else {
interLinks.add(link);
link.setInterLinks(true);
}
}
我通过为 intraLinks
到 LinkNodeLight
class
生成 getter
和 setter
解决了这个问题
protected boolean intraLinks;
public boolean isIntraLinks() {
return intraLinks;
}
public void setInterLinks(boolean interLinks) {
this.interLinks = interLinks;
}
public void setIntraLinks(boolean intraLinks) {
this.intraLinks = intraLinks;
}
我正在尝试检查名为 interLinks
和 intraLinks
的优先队列结构中的两种链接。根据下面的方法 URLremoveCondition()
,我尝试从我的 PQueue
中删除所有这两种 URL 链接 interLinks
和 intraLinks
如果它们达到 MaxWaitTime
我将其设置为 10 Seconds
该方法将删除这些链接。
但问题是方法 URLremoveCondition()
仅从 PQueue
中删除 interLinks
而没有删除 intraLinks
。如何解决此问题以删除 interLinks
和 intraLinks
?
这是我的方法URLremoveCondition()
public static PriorityQueue <LinkNodeLight> PQueue = new PriorityQueue <> ();
private static Integer MaxWaitTime = new Integer (10000); // 10 Seconds
public void URLremoveCondition() {
synchronized (PQueue) {
Iterator<LinkNodeLight> iterator = PQueue.iterator();
while(iterator.hasNext()){
LinkNodeLight URL = iterator.next();
long URLWaitingTime = System.currentTimeMillis() - URL.enqueTime.getMillis();
if(URLWaitingTime > MaxWaitTime){
iterator.remove();
System.out.println("DELETED NODE: " + URL.url + " WAITTIME: " + Long.toString(URLWaitingTime));
}
}
}
}
这是我的 class LinkNodeLight
:
import org.joda.time.DateTime;
public class LinkNodeLight implements Comparable<LinkNodeLight> {
protected String url;
protected float weight;
protected DateTime enqueTime;
protected boolean interLinks;
public String getUrl() {
return url;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
}
public DateTime getEnqueTime() {
return enqueTime;
}
public LinkNodeLight(String url) {
this.url = url;
}
public boolean isInterLinks() {
return interLinks;
}
public void setInterLinks(boolean interLinks) {
this.interLinks = interLinks;
}
public void setEnqueTime(DateTime enqueTime) {
this.enqueTime = enqueTime;
}
@Override
public int compareTo(LinkNodeLight link) {
if (this.weight < link.weight) return 1;
else if (this.weight > link.weight) return -1;
return 0;
}
}
编辑:
我在这里创建 interLinks
和 intraLinks
import java.util.LinkedList;
import java.util.List;
public class URLWeight {
public static List<LinkNodeLight> weight(LinkNode sourceLink, List<LinkNodeLight> links) {
List<LinkNodeLight> interLinks = new LinkedList<>();
List<LinkNodeLight> intraLinks = new LinkedList<>();
for (LinkNodeLight link : links) {
if (isIntraLink(sourceLink, link)) {
intraLinks.add(link);
link.setInterLinks(false);
} else {
interLinks.add(link);
link.setInterLinks(true);
}
}
我通过为 intraLinks
到 LinkNodeLight
class
getter
和 setter
解决了这个问题
protected boolean intraLinks;
public boolean isIntraLinks() {
return intraLinks;
}
public void setInterLinks(boolean interLinks) {
this.interLinks = interLinks;
}
public void setIntraLinks(boolean intraLinks) {
this.intraLinks = intraLinks;
}