如何从作为类的链表中的泛型节点获取信息



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

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

相关内容

  • 没有找到相关文章