我正在研究一个问题,要求我们根据帮助客户所需的时间将客户添加到队列中。花费最少时间的客户是首先得到帮助的客户(实际上没有意义,但很好)。
我已经创建了一个通用的“公共类MyQueue”,问题的主要思想是将MyQueue继承到我们的ServiceQueue类中,基本上就是我们的push方法。这不是完整的代码,我知道它不起作用:
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;
}
}
答案 0 :(得分:0)
为什么必须是链表? 我将CustomerRequests放入SortedSet并将自定义Comparator(比较requiredeServiceTimes)传递给SortedSet的构造函数。 详细信息请记录在这里: http://docs.oracle.com/javase/6/docs/api/java/util/SortedSet.html
一旦元素出现在SortedSet中,您就可以通过“first()”从集合的前面获得最快的客户。
答案 1 :(得分:0)
您是否考虑使用PriorityQueue
而不是自己的队列实施?优先级队列是一种非常有效的选择最小值的方法。这些已成为非常长时间的标准JRE的一部分。请参阅the 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);
}
}
答案 2 :(得分:0)
声明类似于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。