Для цикла с универсальным массивом? - PullRequest
3 голосов
/ 03 марта 2011

Возвращаясь к моим базовым 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++;
    }
  }

, который должен добавлять общие элементы из массива, используя связанный список. К сожалению, это не так, и это первая проблема, с которой я столкнулся. Я получаю сообщение об ошибке:

не может найти символ: длина метода ().

Может кто-нибудь дать мне совет, как мне это исправить?

Большое спасибо!

Ответы [ 6 ]

7 голосов
/ 03 марта 2011

для массива у вас нет метода 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);
}
2 голосов
/ 03 марта 2011

Метод для класса коллекций - .size(), или для массива это свойство * 1002. *):

for( T element : array ) {
    nodes = new NodeList( value, nodes );
    size++;
}
1 голос
/ 03 марта 2011

Если вы хотите убедиться, что возможны только сопоставимые элементы:

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
1 голос
/ 03 марта 2011

В дополнение к тому, что опубликовали другие, вы также можете использовать свой универсальный параметр T:

public class NodeList<T> {
  private T head;
  private NodeList<T> tail;
  public NodeList( T item, NodeList list ) {
    head = item;
    tail = list;
  }
}
1 голос
/ 03 марта 2011

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;
}
0 голосов
/ 03 марта 2011

Это array.length, а не array.length ().

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

устранит ошибку компиляции.

...