Ariezra Ответов: 2

Нужна помощь с этим кодом. Основные массивы в java


isFull, addContact, removeContact и getContactList не работают

Что я уже пробовал:

public class ContactList {
    private static int INITIAL_LENGTH = 3;
    private PersonalContact[] contacts;
    private int numContacts;

   
    public ContactList(){
    //TODO 3: implement this method.
      contacts = new PersonalContact[INITIAL_LENGTH];
      numContacts = 0;


    }
    
   /* 
    *  Returns true if the contact list contains no contacts, false otherwise.
    */
    public boolean isEmpty(){
    //TODO 4: implement this method.
      for(PersonalContact u: contacts){
     	    if(u != null){
      	   return false;
      	}
     }
      return true;
      
    }
   
   /* Adds the PersonalContact object to the next available location in the array.
    * Before adding, the list is checked to see if it is full by calling the isFull() method.
    * If the list is full, it must be expanded before the contact can be added. To do this,
    * the expandList method is called, then the contact is added. If the list is not full, the 
    * contact is added. The numContacts can serve as an index number of the next available cell.
    * After adding, numContacts is updated.
    * Note: the array may have fewer contacts (PersonalContact objects) than its length.
    */
    public void addContact(PersonalContact newContact){
    //TODO 7: implement this method.
      	if(isFull()){
	   expandList();
      }
      for (int z  = 0; z< contacts.length-1; z++){
          if(contacts[z] == null){
            contacts[z] = newContact;
		
      numContacts ++;

         }
       }
    }
   
   /* Removes a contact from the list if it is in the list. The name of 
    * the contact is used to find the contact. If a match to the name is found, 
    * the value at that index is overwritten by null. Then the compressList
    * function is called to re-order the list so all objects are next to each other,
    * starting at index 0.
    * This method returns true if a contact was removed, false otherwise. 
    * After removing, numContacts is updated.
    */
    public boolean removeContact(String targetName){
    //TODO 9: implement this method.
    for(PersonalContact x:contacts){
         if(x.getName() == targetName){
            x = null;
		 compressList();
 return true;
   }
 
 
      
  }
  return false;
 }
   
   /* 
    * Return a list that contains only the PersonalContact objects that have been added.
    * This list does not contain any NULL values.
    * If the list does not contain any contacts, this method returns a PersonalContact array 
    * with zero length.
    */
    public PersonalContact[] getContactList(){
    //TODO 10: implement this method.
    int nulls = 0; 
    for(PersonalContact u: contacts){
	  if(u == null){
	   nulls++;
	}
  }
    PersonalContact[] getContactLists = new PersonalContact[contacts.length - nulls];
    compressList();
    for(int i = 0; i < getContactLists.length - 1; i++){
	   getContactLists[i] = contacts[i];
	}
    

      return getContactLists;

    

  }
   
   /* 
    * Removes all items from the list, resulting in an empty list.
    * The capacity of the new list will revert to the INITIAL_LENGTH.
    * numContacts is reset to 0.
    */
    public void clearContactList(){
    //TODO 11: implement this method.
    PersonalContact[] newcontact = new PersonalContact [INITIAL_LENGTH];
    contacts = newcontact;
    numContacts = 0;
    }
    
    /****** Private, "helper" method section ******/
   
   /* 
    * This method returns true if all cells in the array contain a PersonalContact
    * object, false otherwise. 
    */
    private boolean isFull(){
    //TODO 5: implement this method.
      for(int i = 0; i <= contacts.length-1; i++){
      if(contacts[i] == null){
      return false;
      }

    }
      return true;
}   
   /* Creates a new contacts array that is double the size of the current array.
    * It then copies the contacts from the current array to the new array. 
    * Note that the new array will contain the contacts from the current array followed 
    * by NULL values.
    */
    private void expandList(){
    //TODO 6: implement this method.
    PersonalContact [] expandcontacts = new PersonalContact[contacts.length *2];
      for(int i = 0; i < expandcontacts.length-1; i++){
         if(contacts[i] != null){
            expandcontacts[i] = contacts[i];
            } 
            contacts = expandcontacts;
      }




    }
    
   /* 
    * This method ensures that all PersonalContact objects in the contact list
    * are stored contiguously: next to each other (with no null value between any 
    * of them) starting at index 0. 
    * The method traverses the list and if it finds a null value it moves all objects 
    * to maintain contiguous storage. Design an algorithm to do this and implement it.
    * 
    */
    private void compressList(){
    //TODO 8: implement this method.
    for(int i = 0; i < contacts.length-1; i++){
	  if(contacts[i] == null){
		for(int j = i; j < contacts.length-1; j++){
		    contacts[contacts.length-1] = null;
		    contacts[j] = contacts[j+1];
			}
		}
	}

  }

 }

Patrice T

определение понятия "не работает"

2 Ответов

Рейтинг:
2

Patrice T

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
1

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали электронное письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!

Вы также должны начать учиться задавать вопрос: "это не работает" - это одно из самых бесполезных описаний проблемы, которое мы получаем: оно абсолютно ничего не говорит нам о проблеме. Мы не знаем, получаете ли вы сообщение об ошибке, или неправильные данные, или даже что этот код успешно компилируется!
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.
Итак, расскажите нам, что происходит, когда вы запускаете этот код, что вы ожидали, как вы проверили, что произошло. Помогите нам помочь вам!