2015-11-29 6 views
3

В настоящее время я работаю над программой Bank Account, которая вводит пользователя и вводит его в массив. Он выполняет такие действия, как депонирование, снятие, поиск и т. Д. В настоящее время я придерживаюсь сортировки, основываясь на балансовых суммах в каждой учетной записи. Программа должна сортировать учетные записи на основе баланса от самого высокого до самого низкого и печатать результаты на экране.По убыванию Выбрать Тип массива в Java

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

if (out.equals("Sort")) { 
    int i, j, maxIndex; 
    double maxValue; 

    //getNumberOfAccounts is a static counter incremented each time 
    //a new bank account is created 
    for (i = 0; i < BankAccount.getNumberOfAccounts(); i++) { 
     //Sets first value as largest 
     maxValue = BankAccounts[i].getBalance(); 
     maxIndex = i; //Index of first value 

     for (j = i; j == BankAccount.getNumberOfAccounts(); j++) { 
      //Compares subsequent values to initial max value 
      if (BankAccounts[j].getBalance() > maxValue) { 
       maxValue = BankAccounts[j].getBalance(); 
       maxIndex = j; 
      } 
     } 

     //Attempts to swap values 
     BankAccount temp = BankAccounts[i]; 
     BankAccounts[i] = BankAccounts[maxIndex]; 
     BankAccounts[maxIndex] = temp; 
     //Outputs Bank Account data in descending order based on balance 
     BankAccounts[maxIndex].printReport(); 
    } 
} 

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

Спасибо заранее, и если есть какая-либо дополнительная информация, которую я могу предоставить, я с удовольствием сделаю это.

+1

Спасибо за вход, я удалил первое предложение. – michaeld

+1

Очень хороший первый пост, ясный вопрос, с кодом. – paisanco

ответ

1

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

Итак, вам нужно сделать до того свопа, или выводить значение из правого положения - BankAccounts[i].printReport();

О maxValue - это обновляет каждый шаг, поэтому, если вам это нужно после окончания цикла, вы можете просто получить его как BankAccounts[0].getBalance() после окончания сортировки.

Кроме того, если вам нужно только сортировать элементы, но вы не привязаны использовать выбор рода, я хотел бы рекомендовать Java встроенные методы для сортировки, так что ваш код должен выглядеть следующим образом:

Arrays.sort(BankAccounts, 0, BankAccount.getNumberOfAccounts(), new Comparator<BankAccount>() { 
     @Override 
     public int compare(BankAccount o1, BankAccount o2) { 
      if (o1.getBalance() > o2.getBalance()) return -1; 
      if (o1.getBalance() < o2.getBalance()) return 1; 
      return 0; 
     } 
    } 
); 

После этой операции сортировки массива BankAccounts сортируется в порядке остатков по убыванию, и вы можете печатать отчеты только в простом цикле:

for (i = 0; i < BankAccount.getNumberOfAccounts(); i++) { 
    BankAccounts[i].printReport; 
} 
+0

Спасибо за ввод. К сожалению, ни перемещение метода printReport(), ни изменение индексированной переменной не сменили мой результат. Однако метод сортировки, который вы упомянули, действительно работал отлично. Я надеялся использовать сортировку, но мой профессор сказал, что мы также можем использовать метод сортировки. Мы просто не рассмотрели метод сортировки в классе, но я не совсем понял код. – michaeld

1

Прежде всего, необходимо изменить эту линию

for (j = i; j == BankAccount.getNumberOfAccounts(); j++) { 

в

for (j = i; j < BankAccount.getNumberOfAccounts(); j++) { 

, как вы есть сейчас вы говорите, «цикл до J равна BankAccount.getNumberOfAccounts()» и это никогда не произойдет в этом коде.

Другая проблема с производительностью, которая у вас есть.

BankAccount temp = BankAccounts[i]; 
BankAccounts[i] = BankAccounts[maxIndex]; 
BankAccounts[maxIndex] = temp; 

Имейте, что текущий указатель уже находится в нужном месте. Вы сделаете ненужный «переключатель».

Например: текущее intex (i == 5) наибольшее положение баланса (maxIndex == 5).

Вы будете иметь:

BankAccount temp = BankAccounts[5]; 
BankAccounts[5] = BankAccounts[5]; 
BankAccounts[5] = temp; 

Таким образом, вы можете изменить эту часть следующим образом:

if(i != maxIndex) { 
    //Attempts to swap values 
    BankAccount temp = BankAccounts[i]; 
    BankAccounts[i] = BankAccounts[maxIndex]; 
    BankAccounts[maxIndex] = temp; 
} 
+0

Спасибо за ответ. Я сначала имел j michaeld

+0

Не могли бы вы поставить реализацию getNumberOfAccounts() в свой вопрос? –

+0

Извините, что я не включил его раньше. Я нашел решение этой проблемы. Но ранее в программе я создаю банковские счета с конструктором, а внутри метода конструктора numberOfAccounts увеличивается на 1 каждый раз, когда создается учетная запись. getNumberOfAccounts просто вызывает это число. Я использовал его, потому что в массиве есть пустые места, и я (думаю) это единственный способ избежать исключений из null-указателей. – michaeld

1

Выполнив пару старых родственных нитей я наткнулся на волоске что отлично ответил на мой вопрос. Хотя упомянутый выше метод Array.sort работал отлично, мне было неудобно использовать его просто потому, что я еще не узнал об этом.

  if (out.equals("Sort")){ 


      for (int i = 0; i < BankAccount.getNumberOfAccounts(); i++){ 
       for(int j = i+1; j < BankAccount.getNumberOfAccounts(); j++){ 
        if(BankAccounts[j].getBalance() > BankAccounts[i].getBalance()){ 
         BankAccount [] temp = new BankAccount [BankAccounts.length]; 
         temp [j] = BankAccounts [j]; 
         BankAccounts [j] = BankAccounts [i]; 
         BankAccounts [i] = temp [j]; 
        } 
       } 
      } 

      for (int i = 0; i < BankAccount.getNumberOfAccounts(); i++){ 
       BankAccounts[i].printReport(); 
       System.out.println(); 
      } 

Вот код, который напечатал результаты, которые я искал. Я понял, что мое сравнение во внутреннем цикле было выключено, и я не создавал новый массив для свопа, а только новые объекты. Спасибо за помощь!

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

  • Нет связанных вопросов^_^