Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在两个节点之间交换数据?(爪哇)_Java_Nodes_Sequence - Fatal编程技术网

Java 如何在两个节点之间交换数据?(爪哇)

Java 如何在两个节点之间交换数据?(爪哇),java,nodes,sequence,Java,Nodes,Sequence,我一直在使用节点进行一个项目,对于这个项目,我们必须根据节点中的项所具有的优先级(0-2,0为最高,2为最低)对节点进行排序(降序)。现在,我已经让它部分地工作了,因为当它实际进行交换时,它会使两个项变得相同(我只是尝试交换这些项)。例如:我将输入节点_1,该节点的优先级为0,然后输入节点_2,该节点的优先级为1,然后应按如下顺序排列: Node_2(保持优先级1)->Node_1(保持优先级0) 然后,它应该运行方法将它们排序为(优先级降低): 但它只是将两个节点变为相同(相同优先级): 无论

我一直在使用节点进行一个项目,对于这个项目,我们必须根据节点中的项所具有的优先级(0-2,0为最高,2为最低)对节点进行排序(降序)。现在,我已经让它部分地工作了,因为当它实际进行交换时,它会使两个项变得相同(我只是尝试交换这些项)。例如:我将输入节点_1,该节点的优先级为0,然后输入节点_2,该节点的优先级为1,然后应按如下顺序排列:

Node_2(保持优先级1)->Node_1(保持优先级0)

然后,它应该运行方法将它们排序为(优先级降低):

但它只是将两个节点变为相同(相同优先级):

无论我向其中添加多少节点,它都保持不变。它们都转向具有最高优先级的同一节点。任何帮助都会很好

代码:


请告诉我是否有更好的方法,因为我还在学习。

是否可以使用PriorityQueue而不是实现排序功能

PriorityQueue<Node> pq = new PriorityQueue(new Comparator<Node>(){
    public int compare(Node a, Node b){
        return a.item.getPriority()-b.item.getPriority();
    }
});
p=jobs;
if(p==null) return p;
//add all jobs in PriorityQueue
while (p != null) {
    pq.add(p);
    p=p.next;
}
//Change next pointer
Node head=pq.poll();
Node prev=head;
while(pq.size()>0){
    Node n = pq.poll;
    prev.next=n;
    prev=n;
}
return head;
PriorityQueue pq=新的PriorityQueue(新的比较器(){
公共整数比较(节点a、节点b){
返回a.item.getPriority()-b.item.getPriority();
}
});
p=工作;
如果(p==null)返回p;
//在PriorityQueue中添加所有作业
while(p!=null){
pq.add(p);
p=p.next;
}
//更改下一个指针
节点头=pq.poll();
节点prev=头部;
而(pq.size()>0){
节点n=pq.poll;
上一个=n;
prev=n;
}
回流头;

是否可以使用PriorityQueue而不是实现排序功能

PriorityQueue<Node> pq = new PriorityQueue(new Comparator<Node>(){
    public int compare(Node a, Node b){
        return a.item.getPriority()-b.item.getPriority();
    }
});
p=jobs;
if(p==null) return p;
//add all jobs in PriorityQueue
while (p != null) {
    pq.add(p);
    p=p.next;
}
//Change next pointer
Node head=pq.poll();
Node prev=head;
while(pq.size()>0){
    Node n = pq.poll;
    prev.next=n;
    prev=n;
}
return head;
PriorityQueue pq=新的PriorityQueue(新的比较器(){
公共整数比较(节点a、节点b){
返回a.item.getPriority()-b.item.getPriority();
}
});
p=工作;
如果(p==null)返回p;
//在PriorityQueue中添加所有作业
while(p!=null){
pq.add(p);
p=p.next;
}
//更改下一个指针
节点头=pq.poll();
节点prev=头部;
而(pq.size()>0){
节点n=pq.poll;
上一个=n;
prev=n;
}
回流头;

更像这样的东西可能是:

private void sortJobs(Node p) {

    if (p != null && p.next != null) {

        Node q = p.next;

        Item pItem = p.getItem();
        Item qItem = q.getItem();

        // check for nulls???  Safety???
        if (qItem.getPriority() < pItem.getPriority()) {

            p.setItem(qItem);
            q.setItem(pItem);

         }

         // almost forgot the recursion
         sortJobs(q);

    }

}
private void排序作业(节点p){
if(p!=null&&p.next!=null){
节点q=p.next;
Item pItem=p.getItem();
Item qItem=q.getItem();
//检查是否为空???安全???
if(qItem.getPriority()

可以保持节点的顺序相同,但可以交换其中的项。我们不需要将副本复制到第三个伪值技巧中,因为我们已经有了对这两个项的引用(我们无论如何都需要引用来获取优先级)。

类似这样的东西可能:

private void sortJobs(Node p) {

    if (p != null && p.next != null) {

        Node q = p.next;

        Item pItem = p.getItem();
        Item qItem = q.getItem();

        // check for nulls???  Safety???
        if (qItem.getPriority() < pItem.getPriority()) {

            p.setItem(qItem);
            q.setItem(pItem);

         }

         // almost forgot the recursion
         sortJobs(q);

    }

}
private void排序作业(节点p){
if(p!=null&&p.next!=null){
节点q=p.next;
Item pItem=p.getItem();
Item qItem=q.getItem();
//检查是否为空???安全???
if(qItem.getPriority()

可以保持节点的顺序相同,但可以交换其中的项。我们不需要将副本复制到第三个伪值技巧中,因为我们已经有了对这两个项目的引用(我们无论如何都需要引用来获取优先级)。

安德烈亚斯的回答中已经说过,但我将进一步阐述。因为这是Java,所以您的temp(在本例中为r)只引用了q。这就是为什么当你改变write
q=p,r也会完全改变。因为它们引用对象的同一实例。您需要创建一个临时项以正确交换。正确的修复方法是将r设置为item对象,然后设置
p.item=r
。希望这能有所帮助。

安德烈亚斯的回答中已经提到了这一点,但我将进一步阐述。因为这是Java,所以您的temp(在本例中为r)只引用了q。这就是为什么当你改变write
q=p,r也会完全改变。因为它们引用对象的同一实例。您需要创建一个临时项以正确交换。正确的修复方法是将r设置为item对象,然后设置
p.item=r
。希望这能有所帮助。

我还是个学生,只是在学习,所以我真的不知道该怎么做。很抱歉但我还是很感激你的帮助。我还是个学生,只是在学习,所以我真的不知道该怎么做。很抱歉但是我仍然很欣赏输入。
r=q
不会复制节点,它只是使
r
q
指向同一个节点,这意味着
q.item=p.item
也会更改
r.item
的值。您需要将
q.item
的值保存在临时变量中:
temp=q.item;q、 项目=p.项目;p、 项目=温度
然后您需要将变量重命名为更好的名称,以指示值是什么,例如
q
->
prev
p
->
curr
,或诸如此类。这对我帮助很大,谢谢。正如你所说,更改项目名称确实让事情变得更加清楚,我一直在使用这些名称,因为我们的专业人员就是这样认为我们的,但现在不再这样做了。再次感谢。
r=q
不会复制节点,它只是使
r
q
指向同一节点,这意味着
q.item=p.item
也会更改
r.item
的值。您需要将
q.item
的值保存在临时变量中:
temp=q.item;q、 项目=p.项目;p、 项目=温度
然后您需要将变量重命名为更好的名称,以指示值是什么,例如
q
->
prev
p
->
curr
,或诸如此类。这对我帮助很大,谢谢。就像你说的,改变物品的名称确实让事情变得更糟
private void sortJobs(Node p) {

    if (p != null && p.next != null) {

        Node q = p.next;

        Item pItem = p.getItem();
        Item qItem = q.getItem();

        // check for nulls???  Safety???
        if (qItem.getPriority() < pItem.getPriority()) {

            p.setItem(qItem);
            q.setItem(pItem);

         }

         // almost forgot the recursion
         sortJobs(q);

    }

}