2015-09-24 3 views
0

Итак, у меня возникли проблемы с моим методом add, как реализовать проверку, если объект уже находится в массиве, прежде чем добавлять новый.проверка наличия объекта в списке перед добавлением java

Я также хотел бы создать метод удаления, но каждый раз, когда я пытаюсь его использовать, я получаю исключение нулевого указателя.

import java.util.*; 

public class ContactsArrayList extends AbstractList{ 

    private Contact[] contacts; 
    private int size; 

    public ContactsArrayList(){ 
    //initializes contactArray with a capacity of 1 
     contacts = new Contact[1]; 
     size = 0; 
    } 
    public ContactsArrayList(int capacity){ 
     if(capacity < 0){ 
      try { 
       throw new Exception("Capacity: must be greater than zero."); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     contacts = new Contact[capacity]; 
     size = 0; 
    } 
    public int size(){ 
     //returns size of list 
     return size; 
    } 
    public boolean isEmpty(){ 
     return size == 0; 
    } 
    private void listRangeCheck(int index){ 
     //checks if index is within range as built in debugging method 
     if(index >= size || index < 0){ 
      throw new IndexOutOfBoundsException("Index: " + index + " is not within the list."); 
     } 
    } 
    public Contact get(int index){ 
     //returns index at Contact at specified index 
     listRangeCheck(index); 
     return contacts[index]; 
    } 
    public void capacityCheck(int minCapacity){ 
     //checks current capacity if capacity is less than required, 
     // array copies its current values over to an array double the size 
     int oldCapacity = contacts.length; 
     if(minCapacity > oldCapacity){ 
      int newCapacity = (oldCapacity * 2); 
      if(newCapacity < minCapacity) 
       newCapacity = minCapacity; 
      contacts = Arrays.copyOf(contacts, newCapacity); 
     } 
    } 
    public boolean add(Contact contact){ 
    //appends the specified element to the end 
     capacityCheck(size + 1); 
     contacts[size++] = contact; 
     return true; 
    } 
    public int capacity(){ 
    //returns ContactArray size 
     return contacts.length; 
    } 
    public void sort() { 
     //sorts the specified contact array list 
     List<Contact> c_list = new ArrayList(); 
     c_list = Arrays.asList(contacts); 
     Collections.reverse(c_list); 
     c_list.toArray(contacts); 
    } 
} 
+2

Почему вы изобретаете колесо? Просто используйте 'ArrayList', он уже реализует метод' contains (...) '. – camickr

+1

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

+0

Это должно быть обычай содержит (...), просто использование этого не всегда будет работать. Что делать, если объект OP сравнивается с изменением во времени. – Ceelos

ответ

4

Простой, как всегда:

private boolean contains(Contact contact){ 
    for (int i=0; i<contacts.length; i++){  
     if (<condition to know if the 'contact' object exists>) return true;   
    } 
    return false; 
} 

Но если вы будете рассматривать с помощью ArrayList<Contact>() вы можете просто использовать его

0

Если вы сравниваете объекты, которые я предлагаю вам придумать собственности сравните их, иначе вы снова введете объект, если есть какая-то разница между объектом, который существует, и текущим объектом, который вы пытаетесь добавить.

1

Просьба уточнить. Будете ли вы проверять, имеют ли два отдельно созданных объекта одно и то же содержимое? Или вы будете проверять, добавили ли вы этот объект раньше?

Все объекты имеют метод .equals(), который проверяет, что обе ссылки являются одним и тем же объектом.

Продлить Roey:

private boolean contains(Contact contact) { 
    for (int i = 0; i < contacts.length; i++) { 
     if (contacts[i].equals(contact)) { 
      return true; 
     } 
    } 
    return false; 
} 

В вашем методе добавления, сделать вызов к содержит метод:

if contains(contact) 
    return true 
else 
    add object 

Как ваш метод удалить, вы можете также использовать содержит метод. Общий псевдо-код:

if contains(contact) 
    shift all elements above contact down one slot 
    decrement size 
    return true 
else 
    return true 
Смежные вопросы