我正在处理一个问题,该问题要求我们根据帮助客户所需的时间将客户添加到队列中。花费最少时间的客户是最先得到帮助的客户(这真的没有意义,但哦,好吧(。
我已经创建了一个通用的"公共类MyQueue",问题的主要思想是将MyQueue继承到我们的ServiceQueue类中,本质上是对我们的推送方法进行了适当的修改。这不是完整的代码,我知道它不起作用:
void push(CustomerRequest request){
if (head == null)
{
Node newHead = new Node(request);
head = newHead;
}
else {
Node newCustomer = new Node(request);
Node node = head;
int count;
while(request.requiredServiceTime > node-->*(I need the service time)*)
{
node = node.next;
}
///insert node here
}
}
还有CustomerRequest类:
public class CustomerRequest {
String name;
int requiredServiceTime;
public CustomerRequest(String name, int requiredServiceTime){
this.name = name;
this.requiredServiceTime = requiredServiceTime;
}
}
我的问题是:如何从我创建的、需要放入队列的节点中获取requiredServiceTime信息?
添加:
public class Node<T> {
Node<T> next;
T data;
public Node(T data)
{
this.data = data;
}
public Node(T data, Node<T> next)
{
this.data = data;
this.next = next;
}
}
为什么它必须是一个链表?我会将CustomerRequest放入SortedSet中,并将一个自定义Comparator(用于比较requiredServiceTimes(传递给SortedSet的构造函数。详细信息记录如下:http://docs.oracle.com/javase/6/docs/api/java/util/SortedSet.html
一旦元素在SortedSet中,您就可以用"first(("从集合的前面获得最快的客户。
您是否考虑过使用PriorityQueue
,而不是自己的队列实现?优先级队列是选择最小值的一种非常有效的方法。很长一段时间以来,这些都是标准JRE的一部分。请参阅PriorityQueue javadoc。
诀窍是更新你的类,使它们的默认排序是你想要的顺序。您还可以为队列定义一个Comparator
,以便按所需顺序对CustomerRequest
进行排序。
我会为您的队列使用PriorityQueue
,然后更新CustomerRequest
,使其以自然排序按所需服务时间排序的方式实现Comparable<CustomerRequest>
。下面是一个非常天真的实现:
public class CustomerRequest implements Comparable<CustomerRequest> {
// existing code
...
// Implement Comparable
public int compareTo(CustomerRequest obj) {
// Sort by required service time ascending
if (this.requiredServiceTime > obj.requiredServiceTime)
return 1;
else if (this.requiredServiceTime < obj.requiredServiceTime)
return -1;
else
// Sort by name to break ties
return this.name.compareTo(obj.name);
}
}
声明类似Comparable的接口(http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html)。如果不允许,你不必导入,只需自己制作即可:
public interface Comparable<T> {
int compareTo(T other);
}
让您的CustomerRequest实现Comparable:
public class CustomerRequest implements Comparable {
...
让您的LinkedList需要实现Comparable:的数据
public class Node<T extends Comparable> {
...
然后您可以在插入排序中使用compareTo。