0

我正在处理一个问题,要求我们根据帮助客户所需的时间将客户添加到队列中。花费最少时间的客户是最先得到帮助的客户(这并没有真正的意义,但哦,好吧)。

我已经创建了一个通用的“公共类 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;
}

}

4

3 回答 3

0

您是否考虑过使用PriorityQueue, 而不是您自己的队列实现?优先队列是一种非常有效的选择最小值的方法。长一段时间以来,这些都是标准 JRE 的一部分。请参阅PriorityQueue javadoc

诀窍是然后更新您的类,以便它们的默认排序是您想要的顺序。您还可Comparator以为您的队列定义一个CustomerRequest按您想要的顺序排序的。

我将 aPriorityQueue用于您的队列,然后进行更新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);
    }
}
于 2013-04-09T22:02:42.990 回答
0

为什么它必须是一个链表?我会将 CustomerRequests 放入 SortedSet 并将自定义 Comparator(比较 requiredeServiceTimes)传递给 SortedSet 的构造函数。详细信息记录在这里: http ://docs.oracle.com/javase/6/docs/api/java/util/SortedSet.html

一旦元素在 SortedSet 中,您可以使用“first()”从集合的前面获得最快的客户。

于 2013-04-09T21:48:36.077 回答
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。

于 2013-04-09T22:10:08.770 回答