2010-04-29 3 views
0

Я начал этот путь реализации простого поиска в массиве для назначения hw, не зная, что мы можем использовать ArrayList. Я понял, что в нем есть некоторые ошибки, и решил, что я все равно попытаюсь понять, что моя ошибка, прежде чем использовать ArrayList. У меня в основном есть класс, где я могу добавлять, удалять или искать из массива.Возвращение результатов поиска в массив в Java без ArrayList

public class AcmeLoanManager 
{ 
    public void addLoan(Loan h) 
    { 
     int loanId = h.getLoanId(); 
     loanArray[loanId - 1] = h; 
    } 


    public Loan[] getAllLoans() 
    { 
     return loanArray; 
    } 


    public Loan[] findLoans(Person p) 
    { 
     //Loan[] searchedLoanArray = new Loan[10]; // create new array to hold searched values 
     searchedLoanArray = this.getAllLoans(); // fill new array with all values 

     // Looks through only valid array values, and if Person p does not match using Person.equals() 
     // sets that value to null. 
     for (int i = 0; i < searchedLoanArray.length; i++) { 
      if (searchedLoanArray[i] != null) { 
       if (!(searchedLoanArray[i].getClient().equals(p))) { 
        searchedLoanArray[i] = null; 
       } 
      } 
     } 
     return searchedLoanArray; 
    } 

    public void removeLoan(int loanId) 
    { 
     loanArray[loanId - 1] = null; 
    } 

    private Loan[] loanArray = new Loan[10]; 
    private Loan[] searchedLoanArray = new Loan[10]; // separate array to hold values returned from search 
} 

При тестировании этого, я думал, это сработало, но я думаю, что перезаписываю свою переменную-член после того, как выполняю поиск. Первоначально я думал, что могу создать новый Loan [] в методе и вернуть его, но это, похоже, не работает. Тогда я подумал, что у меня может быть два массива. Тот, который не изменился бы, а другой только для найденных значений. Но я думаю, что я что-то не понимаю, как мелкое и глубокое копирование ??? ....

+1

Какие ошибки вы испытываете в своем коде? –

ответ

1

Возвращаемое значение из getAllLoans перезаписывает ссылку searchLoanArray, что означает, что и creditArray, и searchLoanArray указывают на один и тот же базовый массив , Попробуйте сделать localLarArray локальную переменную, а затем используйте Arrays.copyOf. Если вы пытаетесь не использовать стандартные функции для своей домашней работы, вручную создайте новый массив займов того же размера, что и creditArray, а затем зациклируйте и скопируйте значения.

1

ваш поисковой запрос и loanarray указывают на тот же массив. делает этот

private Loan[] searchedLoanArray = new Loan[10] 

ничего не делает, как вы никогда не использовать, что новый кредит [10]

это ключ к вашей проблеме

searchedLoanArray = this.getAllLoans() 

что просто указывает searchedLoanArray на loanArray

0

Вы мог бы переписать его следующим образом:

public Loan[] findLoans(Person p) 
{ 
    Loan[] allLoans = this.getAllLoans(); 
    System.arraycopy(allLoans, searchedLoanArray, 0, 0, allLoans.length); // fill new array with all values 

    // remainder of method the same 

}

Но как он стоит, код все еще имеет некоторые проблемы:

  1. Максимальное количество кредитов фиксируется на размер массива. Вы будете избегать этой проблемы при переключении на List<Loan>.
  2. Использование идентификатора в качестве индекса означает, что ваши идентификаторы должны быть тщательно сгенерированы. Если идентификаторы поступают из базы данных, вы можете обнаружить, что список пытается выделить огромное количество памяти для того, чтобы сам по себе соответствовать идентификатору. Вам лучше использовать карту, тогда размер карты будет основываться на количестве кредитов, а не на их идентификаторах.
  3. По мере увеличения количества людей и кредитов время поиска также увеличится. Вы можете сократить время поиска до постоянной (независимо от количества людей) с помощью Карты>, которая позволяет быстро просматривать кредиты, связанные с этим человеком.

Вот версия с этими изменениями:

class AcmeLoanManager 
    { 
     public void addLoan(Loan l) 
     { 
     Person client = l.getClient(); 
     List<Loan> loans = clientLoans.get(l); 
     if (loans==null) 
     { 
      loans = new ArrayList(); 
      clientLoans.put(client, loans); 
     } 
     loans.add(l); 
     allLoans.put(l.getLoanId(), l); 
     } 

     public void removeLoan(int loanId) 
     {   
     Loan l = loans.remove(loanId); 
     clientLoans.remove(loan); 
     } 

     public Collection<Loan> getAllLoans() 
     { 
      return loans.values(); 
     } 

     public List<Loan> findLoans(Person p) 
     { 
      List<Loan> loans = clientLoans.get(p); 
      if (loans==null) 
       loans = Collections.emptyList(); 
      return loans; 
     } 

     private Map<Integer,Loan> allLoans = new HashMap<Integer,Loan>(); 
     private Map<Person, List<Loan>> clientLoans = new HashMap<Person,List<Loan>>(); 
    } 

Я надеюсь, что это помогает!

0

То, что я хотел бы сделать, - это перебрать значения и переназначить каждое значение для новой переменной.В качестве альтернативы вы можете использовать технику «глубокой копии», описанную здесь в Javaworld: http://www.javaworld.com/javaworld/javatips/jw-javatip76.html

Смежные вопросы