0

Java の関数への引数としてポインターへのポインターを渡すことができません。Java にはポインターがなく、代わりにオブジェクトへの参照を渡すことがわかっています。これがどのように行われるか知りたいです。疑問を解消するために、実装しているプログラムのコード スニペットを貼り付けます。

次のプログラムでは、メソッド「QuickSortRecur」からメソッド「Partition」を呼び出しています。ほとんどの場合、C で作業しているため、パラメーターnewHeadおよびnewEndをポインターとしてポインターに送信する方法がわかりません。

以下の行の C に相当するものについても言及しましたが、Java で同じものを実装する方法を知りたいだけですか?

ジャワ:

public ListNode Partition(ListNode lhead,ListNode lend,ListNode newHead,ListNode newEnd){
         ---------
         ---------
         ---------

    }
public ListNode QuickSortRecur(ListNode lhead,ListNode lend){
    ListNode newHead=null;
    ListNode newEnd=null;
    ListNode pivot;     

    pivot=Partition(lhead,lend,newHead,newEnd);
    if(newHead==null)
            {
            System.out.println("This is not updated ");
            }
       }

C 上記の署名に相当するもの:

struct node *partition(struct node *head, struct node *end,
                       struct node **newHead, struct node **newEnd){
}

struct node *quickSortRecur(struct node *head, struct node *end)
{
struct node *pivot = partition(head, end, &newHead, &newEnd);
}
4

2 に答える 2

3

C のポインタが Java の参照とほぼ同等であると考えると、ポインタへのポインタとほぼ同等なのは、参照をカプセル化する可​​変クラスです。

たとえば、次のようなものを構築できます。

class ListNodeReference {
    private ListNode node;
    public ListNode getNode() {
        return node;
    }
    public void setNode(ListNode theNode) {
        node = theNode;
    }
}

ListNodeReferenceCプログラムが単一の逆参照を使用して実際のポインターを取得するのとほぼ同じ方法で、getおよびsetメソッドを使用してそれを取得または設定できる関数に渡すことができます(コードがアクセスするListNodeと、二重の逆参照が自動的に発生します。すでに参照オブジェクトです)。

これは 1 対 1 の置換ではなく、非常に大まかな対応であることに注意してください。たとえば、ListNodeを使用してオブジェクトの配列を返す方法はありませんListNodeReference

于 2013-08-07T16:36:52.980 に答える
1

これで問題を解決できました..

     public class LinkedList {
    public ListNode head;
    private ListNode newHead;
    private ListNode newEnd;

    LinkedList(){
        head = null;
        newHead=null;
        newEnd=null;
    }

    public ListNode getNewEnd() {
        return this.newEnd;
    }
    public void setNewEnd(ListNode newEnd) {
       this.newEnd=newEnd;
    }

    public ListNode getNewHead(){
        return this.newHead;
    }

    public void setNewHead(ListNode newHead){
        this.newHead=newHead;
    }

    public ListNode getHead(){
        return this.head;
    }
    public void setHead(ListNode head){
        this.head=head;
    }

public ListNode Partition(ListNode lhead,ListNode lend,LinkedList Ref){
        ListNode pivot=lend;
        ListNode End=lend;
        ListNode curr=lhead;
        //ListNode temp=null;
        ListNode previous=null;

        ListNode newHead=Ref.getNewHead();
        ListNode newEnd=Ref.getNewEnd();
                --------------------------
        -----implementation -----
                --------------------------

        Ref.setNewEnd(newEnd);
        Ref.setNewHead(newHead);
        return pivot;

        }
    public ListNode QuickSortRecur(ListNode lhead,ListNode lend){
        ListNode newHead=null;
        ListNode newEnd=null;
        ListNode pivot;     
        LinkedList linkRef=new LinkedList();

        pivot=Partition(lhead,lend,linkRef);
        newHead=linkRef.getNewHead();
        newEnd=linkRef.getNewEnd();




        return newHead;
    }


}
于 2013-08-07T17:09:45.153 に答える