2017-10-25 2 views
0

私はWebberのModern Programming Languagesの問題を抱えていますが、メソッドが別のIntList yを取り、追加されるIntList xのappendメソッドを実装するのが難しいですxの後ろに。相続人JavaでIntListクラスのAppendメソッドを実装する

public class IntList { 
    private ConsCell start; 

    public IntList cons (int h) { 
    return new IntList(new ConsCell(h, start)); 
    } 

    public int length() { 
    int len = 0; 
    ConsCell cell = start; 
    while (cell != null) { 
     len++; 
     cell = cell.getTail(); 
    } 
    return len; 
    } 

    public IntList append(IntList y) { 
    ConsCell x = start; 
    while (x.getTail() != nil) { 
     x = x.getTail; 
    } 
    x = y.start; 
    return new IntList(x); 
    } 
} 

ConsCell

public class ConsCell { 
    private int head; 
    private ConsCell tail; 

    public ConsCell(int h, ConsCell t) { 
    head = h; 
    tail = t; 
    } 

    public int getHead() { 
    return head; 
    } 

    public ConsCell getTail() { 
    return tail; 
    } 
} 

のクラスだから、appendメソッドの後ろに私の思考プロセスは、あなたが最後に到達するまでに(リストを下に移動します

  1. である:ここではコードですこの場合、start.getTailがnullの場合)
  2. リストの末尾に達すると、新しいIntListをxの末尾に追加します。
  3. は、xとyを含む新しいIntListを返す

残念ながら意図したとおりにプログラムがうまくいかなかったと誰もが私にいくつかの洞察力を与えることができれば、私は不思議でしたか?

+2

追加メソッドで 'x.tail = y.start'にする必要がありますか?新しいIntListを返す必要はありません。ちょうどそれ自身を返します。つまり、「this」で十分です。 – Alex

+1

@アレックスに加えて、途中で途中になっているので、 'start'ではなく' x'の位置ではなく、 'start'を返さなければなりません.... –

+0

の組み合わせを追加しました。 – guillermop

答えて

0

append方法は、私は彼らがプライベートであり、アクセスにセッターを必要とするので、あなたは、あなたのクラスにセッターメソッドを追加する必要があると仮定し、この

public IntList append(IntList y) { 
    ConsCell x = start; 
    while (x.getTail() != null) { 
     x = x.getTail(); 
    } 
    x.setTail(y.getStart()); 
    return this; 
} 

ようにする必要がありますそれら。そして、変数のセッターとゲッタを持つことは良い習慣です。

appendメソッドのConsCellインスタンスを直接変更したため、それ自体を返すか、新しいIntListを返すことに違いはありません。 IntListの両方で変更すると、同じリストConsCellのインスタンスを指しているので、他のものを効果的に変更します。

新しいものが本当に新しい場合は、IntListは古いものとは独立しています。IntListの各要素を新しいConsCellにコピーする必要があります。

+0

ありがとう、私はあなたの推薦を試してみたいので、素晴らしい新しいIntListが必要です。 – guillermop

0

はこの試してみてください。

public IntList append(IntList y) { 
    ConsCell x = start; 
    while (x.getTail() != null) { 
     x = x.getTail(); 
    } 
    x.tail = y.start; 
    return new IntList(start); 
} 
関連する問題