2016-07-03 6 views
2

私はJavaを学び始めています。私はコードに含まれている特定のインタフェースを持つ二重リンクリストを実装する必要があります。 私のメソッドinsertAtTheEnd()は、いくつかの要素を挿入した後に要素に値nullがあるので、正しく機能していないようです。 そのトピックについて同様の質問を確認し、問題への回答を適用しようとしましたが、それ以上は得られませんでした。どのように私はそれを動作させるためにこのメソッドを設定することができますので、どんな助けも高く評価されます。 ありがとう!また、ここでJavaで二重リンクされたリストにノードを追加する方法は?

public interface IValueElement 
{ 
    public String getName(); 
    public void setName(String paramName); 
    public int getValue(); 
    public void setValue(int paramValue); 
} 

public interface IListElement 
{ 
    public IValueElement getValueElement(); 
    public void setValueElement(IValueElement value); 
    public IListElement getPredecessor(); 
    public void setPredecessor(IListElement predecessor); 
    public IListElement getSuccessor(); 
    public void setSuccessor(IListElement successor); 
} 

public interface IList 
{ 
    public IListElement getHead(); 
    public void insertAtTheEnd(IValueElement value); 
//... 
} 

public class List implements IList 
{ 
    public List() 
    { 
     if (head == null) 
     { 
      head = new ListElement(null); 
     } 
     else 
     { 
      return; 
     } 
    } 

    private IListElement head; 

    public IListElement getHead() 
    { 
     return head; 
    } 

    public void insertAtTheEnd(IValueElement value) 
    { 
     if (head.getSuccessor() != null) 
     { 
      IListElement l = head; 
      while (l.getSuccessor() != null) 
       l = l.getSuccessor(); 
      IListElement q = new ListElement(value); 
      l.setPredecessor(q); 
     } 
     else 
     { 
      IListElement q = new ListElement(value); 
      q.setPredecessor(head); 
      q.setSuccessor(null); 
      head.setSuccessor(q); 
      head.setPredecessor(q); 
     } 
    } 
} 

はValueElementとListElementの私の実装である:

//ListElement.java 

public class ListElement implements IListElement 
{ 
    public ListElement(IValueElement value) 
    { 
     this.valueElement = checkValueElementAttribute(value); 
    } 

    private IValueElement checkValueElementAttribute(IValueElement value) 
    { 
     return (value == null) ? new ValueElement(null, 0) : value; 
    } 

    private IValueElement valueElement; 

    public IValueElement getValueElement() 
    { 
     return this.valueElement; 
    } 

    public void setValueElement(IValueElement value) 
    { 
     if (value != null) 
     { 
      this.valueElement = value; 
     } 
    } 

    private IListElement predecessor; 

    public IListElement getPredecessor() 
    { 
     return this.predecessor; 
    } 

    public void setPredecessor(IListElement predecessor) 
    { 
     this.predecessor = predecessor; 
    } 

    private IListElement successor; 

    public IListElement getSuccessor() 
    { 
     return this.successor; 
    } 

    public void setSuccessor(IListElement successor) 
    { 
     this.successor = successor; 
    } 
} 


// ValueElement.java 
public class ValueElement implements IValueElement 
{ 
    private String name; 

    public String getName() 
    { 
     return this.name; 
    } 

    public void setName(String paramName) 
    { 
     if (paramName != null) 
     { 
      this.name = paramName; 
     } 
    } 

    public ValueElement(String name, int value) 
    { 
     if (name == null || name.equals("")) 
     { 
      name = "default"; 
     } 
     else 
     { 
      this.name = name; 
     } 
     this.value = value; 
    } 

    private int value; 

    public int getValue() 
    { 
     return this.value; 
    } 

    public void setValue(int paramValue) 
    { 
     if (paramValue != 0) 
     { 
      this.value = paramValue; 
     } 
    } 

    public String toString() 
    { 
     return "Name: " + this.name + " - Value: " + this.value; 
    } 

} 
+0

すべきではないので、同じ要素に先行および後続の両方の設定が含まれています新人y構築オブジェクトは常に 'head'をnullとして持ちます。コンストラクタを完全に削除し、宣言したところで 'head'を初期化することができます。 – Kayaman

+0

あなたの 'if'ブロックを見てください。 elseブロックとは異なり、それは何かの後継を設定しません。だから何かが欠けている。また、qは新しいエンドノードであるため、前のノードではなく 'l'の後継ノードでなければなりません。良い変数の命名はあなたを助けるでしょう。 –

+0

@Kayaman:そうです、ヒントのおかげで。頭はヌルではないはずですが、これは間違いです。 – mark

答えて

0

我々は唯一、これらの問題を考えることができ、今のよう、私たちはそれを実行して、あなたを助けることができるように完全なコードを提供してください:

1)あなたはそれらのノード 2にsetValueElementと呼ばれていない可能性があります)あなたのelseブロックをコード

のその明確な間違ったラインは、このコンストラクタは、これらの行が含まれていない、彼らは以来、全く不要だなぜあなたのコード

public void insertAtTheEnd(IValueElement value) 
    { 
     if (head.getSuccessor() != null) 
     { 
      IListElement l = head; 
      while (l.getSuccessor() != null) 
       l = l.getSuccessor(); 
      IListElement q = new ListElement(value); 
      l.setSuccessor(q); 
     }  

    else 
     { 
      IListElement q = new ListElement(value); 
      q.setPredecessor(head); 
      q.setSuccessor(null); 
      head.setSuccessor(q); 
     } 
    } 
+0

これはコメントです – AADProgramming

+0

ありがとうございます、私はその行を確認します。私はちょうど要求されたコードを含んでいます(前の答えを見てください)。 – mark

+0

@AADTechnical私の評判は私にはコメントできません –

0

はあなたのためにIValueElementとIListElementの実装が提供されている、または彼らはあなたにも実装しなければならない何かありますか?あなたが提供したコードから、私はそれらの実装を見ることができません。

あなたのメソッドinsertAtTheEndに関しては、ほとんどの場合、正しいアイデアを持っているようですが、改善することができます。

ifブロックの最後では、lの前にqを設定します。私はそれが間違った方法かもしれないと思う。その時点でlはリストの最後の要素であり、それがなくなるまで後継チェーンに沿って歩いていたので、新しい要素(q)は前任者ではなく後継者として追加されるはずです。 さらに、qには前任者をlに設定する必要があると思います。

qの前身と後継者を正しく設定し、頭の後継者を正しく設定すると、なぜ頭の前任者をqに設定するのですか?それはqを後継者と前任者の両方にするでしょう。私はあなたがその最後のsetPredecessor呼び出しを削除するべきだと思います。

+0

あなたの答えをありがとう、私はそれを確認し、それを改善しようとします。私はJavaに新しいので、おそらく私は時間がかかります。私はIValueElementとIListElementの実装を含めました。 – mark

関連する問題