如何从作为类的链接列表中的通用节点获取信息

时间:2013-04-09 21:39:55

标签: java linked-list queue

我正在研究一个问题,要求我们根据帮助客户所需的时间将客户添加到队列中。花费最少时间的客户是首先得到帮助的客户(实际上没有意义,但很好)。

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

}

3 个答案:

答案 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。