Конструктор копирования для строкового массива в Java - PullRequest
1 голос
/ 30 сентября 2019

Итак, я сейчас работаю над проектом, воссоздающим методы для списков строковых массивов и списков связанных строк. Существует интерфейс StringList, который реализуют как ArrayStringList, так и LinkedStringList. Нам не разрешено видеть исходный код интерфейса - только документация по API. Для каждого класса мы должны создать конструктор по умолчанию и конструктор копирования для обоих классов. Я выполнил тесты, и конструкторы по умолчанию оба прошли, но конструктор копирования ArrayStringList не работает и выдает сообщение об ошибке «null» или «-1». Я довольно плохо знаком с наследованием и интерфейсами, и я думаю, что параметры объекта и типы данных массива строк меня немного сбивают с толку.

Вот код, который у меня есть, и методы, используемые в конструкторе:

Конструктор My Copy:

private String[] stringArray;
private int size;

public ArrayStringList(StringList sl) {
    size = sl.size();
    ArrayStringList asl = new ArrayStringList();
    for(int i = 0; i < size-1; i++) {
        if(sl.get(i) != null) {
            asl.set(i,sl.get(i).toString());
        } //if
    } // for
} // copy constructor

Размер:

public int size() {
    return stringArray.length;
} // size

Метод получения:

public String get(int index) {
    if(index < 0 || index >= size) {
        throw new IndexOutOfBoundsException("out of bounds");
} else {
        return stringArray[index];
    }
} //get

Метод задания:

public String set(int index, String s) {
    String old = stringArray[index];
stringArray[index] = s;
    return old;
} // set

В проекте описание конструктора копирования было следующим:

Реализующий класс должен явно определять конструктор копирования. Конструктор копирования должен принимать ровно один параметр типа интерфейса StringList. Это должно сделать вновь созданный объект списка глубокой копией списка, на который ссылается параметр конструктора. Следовательно, начальный размер и строковые элементы нового объекта списка будут такими же, как и у другого списка. Для ясности, другой список может быть объектом любой реализации интерфейса StringList. Никаких других предположений о типе объекта делать не следует.

Ответы [ 3 ]

2 голосов
/ 30 сентября 2019
public class ArrayStringList implements StringList {

  private static final int INITIAL_CAPACITY = 10;

  private String[] stringArray;
  private int size;

  public ArrayStringList(StringList sl) {
    stringArray = sl.toArray();
    size = stringArray.length;
  }


  public ArrayStringList() {
    stringArray = new String[INITIAL_CAPACITY];
    size = 0;
  }

  // TODO: Extract 'if-cascade' to an validate(..) method 
  @Override
  public String set(int index, String s) {
    if (index >= size) {
      throw new IndexOutOfBoundsException("")
    } else if (s == null) {
      throw new NullPointerException("the specified string is null");
    } else if (s.isEmpty()) {
      throw new IllegalArgumentException("specified string is empty");
    }
    String old = stringArray[index];
    stringArray[index] = s;
    return old;
  }

  // TODO: Check if posible to extend the stringArray
  @Override
  public boolean add(String s) {
    if (s == null) {
      throw new NullPointerException("the specified string is null");
    } else if (s.isEmpty()) {
      throw new IllegalArgumentException("specified string is empty");
    }

    if (size == stringArray.length) {
      int newListCapacity = stringArray.length * 2;
      stringArray = Arrays.copyOf(stringArray, newListCapacity);
    }
    stringArray[++size] = s;
    return true;
  }

  // TODO: implement other methods ...
}

Имейте в виду, что эта реализация все еще содержит ошибки, но вы можете использовать ее в качестве отправной точки

1 голос
/ 30 сентября 2019
public void ArrayStringList(StringList sl) {
    size = sl.size();
    ArrayStringList asl = new ArrayStringList();
    for(int i = 0; i < size; i++) {
        if(sl.get(i) != null) {
            String s  = asl.set(i,sl.get(i).toString());
            System.out.println(s);
        } //if
    } // for
}

Измените метод установки, как показано ниже. И назовите это с помощью класса объекта. он установит значение в глобальном статическом списке.

//Change set method like this
public String set(int index, String s) {

    stringArray[index] = s;
    return stringArray[index];
}
1 голос
/ 30 сентября 2019

Я бы инициализировал внутренний массив значением size, а также использовал бы тот факт, что класс String также имеет конструктор копирования

public ArrayStringList(StringList sl) {
    this.size = sl.size();
    this.stringArray = new String[size];
    for(int j = 0; j < size; j++) {
        this.stringArray[j] = new String(sl.get(i));
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...