3

ここで私の基本的な ADT の内容に戻り、Java を学習することで一石二鳥を殺そうとしている間に、一般的なリンク リスト (自分で作成している) を使用してマージ ソートの簡単なアルゴリズムを作成しようとしています。私が最初に想像していたよりもはるかに難しいことが証明されています! 誰でも私を助けてくれますか?基本から始めて、さらに進んだらこの記事を更新します。

一般的なリンク リストの私のコードは次のとおりです。

    public class NodeList<T> {
  private Comparable head;
  private NodeList tail;
  public NodeList( Comparable item, NodeList list ) {
    head = item;
    tail = list;
  }

}

次のように、作成した別のクラスでこのクラスにアクセスしようとしています。

public class MyList<T> {

  private NodeList<T> nodes;
  private int size;
  public MyList( ) { 
    nodes = null; 
  }

  public MyList(T[] array ){
    for(int countArray = 0; countArray <= array.length() ; countArray++) {
      nodes= new NodeList( value, nodes );
      size++;
    }
  }

リンクされたリストを使用して、配列から一般的なアイテムを追加する必要があります。残念ながら、そうではなく、これが私が遭遇した最初の問題です。エラーが発生しています:

シンボルが見つかりません: メソッド length()。

どうすればこれを修正できるかについて誰かアドバイスをもらえますか?

どうもありがとう!

4

6 に答える 6

7

配列には length() メソッドはありませんが、長さのメンバーはあります: array.length

さらに、countArray が array.length に達する前に反復を停止し、使用する前にサイズを初期化する必要があります。

final int arrayLength = array.length;
size = arrayLength;
nodes = null;
for(int i = 0; i < arrayLength; ++i) {
      nodes = new NodeList(array[i], nodes);
}

また

nodes = null;
size = array.length;
for(T element : array) {
      nodes = new NodeList(element, nodes);
}
于 2011-03-03T16:04:37.617 に答える
2

コレクション クラスのメソッドはです。.size()配列のメソッドは.lengthプロパティです。

ただし、「強化された」 for ループ (別名 foreach) を使用して、これらのいずれかをループできます。

for( T element : array ) {
    nodes = new NodeList( value, nodes );
    size++;
}
于 2011-03-03T16:04:37.320 に答える
1

同等のアイテムのみが可能であることを確認したい場合:

public class NodeList<T extends Comparable<T> > {
  private T head;
  private NodeList<T> tail;
  public NodeList( T item, NodeList<T> list ) {
    head = item;
   tail = list;
  }
}

public class MyList<T extends Comparable<T>> {
...
}

さらに、コンストラクターがvar argsを使用する場合、リストを作成するためのより便利な方法が得られます。

public MyList(T... array ) {
  for( T item : array ) {
    nodes = new NodeList<T>(item, nodes); 
  }
  size = array.length;
}

このようにして、コンストラクターを次のように呼び出すことができます。

new MyList<Long>(); //empty list
new MyList<Long>( 1L ); //one entry
new MyList<Long>( 1L, 2L, 3L ); //3 entries
Long[] array = new Long[] { 1L, 2L, 3L, 4L };
new MyList<Long>( array ); //use existing array
于 2011-03-03T16:14:09.883 に答える
1

他の人が投稿したものに加えて、ジェネリック パラメータ T を使用することもできます。

public class NodeList<T> {
  private T head;
  private NodeList<T> tail;
  public NodeList( T item, NodeList list ) {
    head = item;
    tail = list;
  }
}
于 2011-03-03T16:07:47.107 に答える
1

length配列のメソッドではなくフィールドです。括弧を削除します。

for(int countArray = 0; countArray <= array.length ; countArray++) {
  nodes= new NodeList( value, nodes );
  size++;
}

コンストラクタ全体を記述するより良い方法を次に示します。

public MyList(T[] array ){
    nodes = null;
    for(T t : array) {
        nodes = new NodeList(t, nodes);
    }
    size = array.length;
}
于 2011-03-03T16:04:49.190 に答える
0

array.length() ではなく、array.length です。

for(int countArray = 0; countArray <= array.length ; countArray++) {

コンパイルエラーを解決します。

于 2011-03-03T16:06:36.260 に答える