Возврат результатов поиска в массиве на Java без ArrayList - PullRequest
0 голосов
/ 29 апреля 2010

Я начал этот путь с реализации простого поиска в массиве для назначения hw, не зная, что мы можем использовать ArrayList. Я понял, что в нем есть некоторые ошибки, и решил, что я все еще буду пытаться узнать, что это за ошибка, прежде чем использовать 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 [] и вернуть его, но это не сработало. Тогда я подумал, что могу иметь два массива. Один, который не изменится, а другой только для искомых значений. Но я думаю, что я чего-то не понимаю, например, мелкое или глубокое копирование ??? ....

Ответы [ 4 ]

1 голос
/ 29 апреля 2010

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

private Loan[] searchedLoanArray = new Loan[10]

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

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

searchedLoanArray = this.getAllLoans()

это просто указывает, что searchLoanArray указывает на loanArray

1 голос
/ 29 апреля 2010

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

0 голосов
/ 29 апреля 2010

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

0 голосов
/ 29 апреля 2010

Вы можете переписать это так:

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>>();
   }

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...