2013-04-09 70 views
0

我正在处理一个问题,要求我们根据帮助客户所需的时间量添加队列中的客户。花费最少时间的客户是那些首先会得到帮助的客户(虽然没有意义,但很好)。如何从类属链接列表中的通用节点获取信息

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

}

+0

请向我们展示您的Node类。 – Mikkel 2013-04-09 21:56:34

+0

刚刚添加了节点类 – tathyler 2013-04-09 21:58:48

回答

0

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

一旦元素在SortedSet的,你可以从一组的前面加上“第()”获得最快的客户。

+0

我在数据结构类中,所以我们必须创建所有的数据结构。我们不能使用任何进口。 – tathyler 2013-04-09 21:51:06

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); 
    } 
} 
0

声明的接口一样具有可比性(http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html)。您不必导入它,如果你不能,你来就让它:

public interface Comparable<T> { 
    int compareTo(T other); 
} 

让你CustomerRequest实现可比:

public class CustomerRequest implements Comparable { 
    ... 

让您的LinkedList的要求实现可比数据:

public class Node<T extends Comparable> { 
    ... 

然后,您可以在插入排序中使用compareTo。