2017-02-20 23 views
-1

Мой код находится в пакете и разделен на два отдельных файла .java. Он печатает список опций для сортировки ArrayList, который пользователь может выбрать, введя правильный номер. Однако по какой-то причине он не распечатывает отсортированный список после ввода, ну что угодно. Может ли кто-нибудь помочь?Не удается завершить программу сортировки Java ArrayList, которая запрашивает у пользователя, как сортировать ArrayList

Вот мой пользовательский класс Object, Contact.java:

package Sorter; 

import java.util.Comparator; 

public class Contact { 
    private String firstName; 
    private String lastName; 
    private String state; 
    private Integer age; 

public Contact(String firstName, String lastName, String state, Integer age) { 

    this.firstName = firstName; 
    this.lastName = lastName; 
    this.state = state; 
} 

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getLastName() { 
    return lastName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

public String getState() { 
    return state; 
} 

public void setState(String state) { 
    this.state = state; 
} 

public Integer getAge() { 
    return age; 
} 

public void setAge(int age) { 
    this.age = age; 
} 

public static Comparator<Contact> lastNameComparator = new Comparator<Contact>() { 

    public int compare(Contact s1, Contact s2) { 
     String contactLastName1 = s1.getLastName().toUpperCase(); 
     String contactLastName2 = s2.getLastName().toUpperCase(); 

     return contactLastName1.compareTo(contactLastName2); 
    } 
}; 

public static Comparator<Contact> stateComparator = new Comparator<Contact>() { 

    public int compare(Contact s1, Contact s2) { 
     String state1 = s1.getState().toUpperCase(); 
     String state2 = s2.getState().toUpperCase(); 

     return state1.compareTo(state2); 
    } 
}; 

public static Comparator<Contact> ageComparator = new Comparator<Contact>() { 

    public int compare(Contact s1, Contact s2) { 
     int age1 = s1.getAge(); 
     int age2 = s2.getAge(); 

     return age1 - age2; 
    } 
}; 

@Override 
public String toString() { 
    return ("First Name: " + firstName + ", Last Name: " + lastName + ", State: " + state + ", Age: " + age); 
} 
} 

А вот мой Sort.java: пакет сортировщик;

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Scanner; 

public class TestSortOptions { 

public static void main(String[] args) { 
    ArrayList<Contact> contacts = initializeContactsArray(); 
    promptForOption(contacts); 
} 

private static ArrayList<Contact> initializeContactsArray() { 
    ArrayList<Contact> contacts = new ArrayList<Contact>(); 
    contacts.add(new Contact("Joe", "Jones", "IL", 35)); 
    contacts.add(new Contact("Bill", "Barnes", "OH", 62)); 
    contacts.add(new Contact("Ida", "Know", "FL", 23)); 
    contacts.add(new Contact("Adam", "Ant", "MI", 14)); 
    contacts.add(new Contact("Jane", "Doe", "CA", 41)); 

    return contacts; 
} 

private static void promptForOption(ArrayList<Contact> contacts) { 
    Scanner input = new Scanner(System.in); 

    System.out.println("Options \nSort by Last Name: [1] " + "\nSort by Home State: [2] " 
      + "\nSort by Age:  [3] " + "\nExit Application: [0] " + "\n\nPlease enter your choice: "); 
    String answer = input.next(); 

    if (answer == "1") { 
     Collections.sort(contacts, Contact.lastNameComparator); 
     for (Contact contact : contacts) { 
      System.out.println(contact); 
     } 

     if (answer == "2") { 
      Collections.sort(contacts, Contact.stateComparator); 
      for (Contact contact : contacts) { 
       System.out.println(contact); 
      } 

      if (answer == "3") { 
       Collections.sort(contacts, Contact.ageComparator); 
       for (Contact contact : contacts) { 
        System.out.println(contact); 
       } 

       if (answer == "0") { 
        System.exit(0); 
       } 

       else { 
        System.out.println("Invalid Entry"); 
       } 
      } 
     } 
    } 
} 
} 
+3

Добро пожаловать в переполнение стека! Похоже, вам нужно научиться использовать отладчик. Пожалуйста, помогите нам с некоторыми [дополнительными методами отладки] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Если у вас все еще есть проблемы после этого, пожалуйста, не забудьте вернуться с более подробной информацией. –

+0

'if (answer ==" 1 ") {' - Помните, что вы не можете использовать '==' для строк. Вам нужно использовать '.equals()'. –

+0

@DM спасибо, что указали это; Я сделал ошибку новобранец, думая, что все наоборот. Очень полезно! – IwataFan

ответ

0

Вы пытаетесь распечатать список контактов после каждого варианта. Было бы лучше назвать это один раз. Заменить определение вашего promptForOption API с кодом приведенного ниже

private static void promptForOption(ArrayList<Contact> contacts) { 
Scanner input = new Scanner(System.in); 

System.out.println("Options \nSort by Last Name: [1] " + "\nSort by Home State: [2] " 
     + "\nSort by Age:  [3] " + "\nExit Application: [0] " + "\n\nPlease enter your choice: "); 
String answer = input.next(); 

    switch(answer) 
    { 
    case "1":Collections.sort(contacts, Contact.lastNameComparator); 
      break; 
    case "2":Collections.sort(contacts, Contact.stateComparator); 
      break; 
    case "3":Collections.sort(contacts, Contact.ageComparator); 
      break; 
    case "4":Collections.sort(contacts, Contact.ageComparator); 
      break; 
    case "0": 
    default: System.out.println("Invalid Entry"); 
      System.exit(0); 
    } 
    for (Contact contact : contacts) { 
     System.out.println(contact); 
    } 
} 

Вам необходимо также обновить определение конструктора захватить возраст.

public Contact(String firstName, String lastName, String state, Integer age) { 

    this.firstName = firstName; 
    this.lastName = lastName; 
    this.state = state; 
    this.age=age; 
} 
0

Кажется, что вы вложили утверждения if, когда вам действительно не должно быть. Он должен быть в формате:

if (answer.equals("1")) { 
     //Do business 
    } else if (answer.equals("2") { 
     //Do other business 
    } else if (answer.equals("3") { 
     //Do other other business 
    } else { 
     //Bad input 
    } 

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

switch(input.next) { 
     case "1": 
      //Do business 
      break; 
     case "2": 
      //Do other business 
      break; 
     case "3": 
      //Do other other business 
      break; 
     default: 
      //Bad input 
      break; 
    } 

Имейте в виду поток вашего метода в настоящее время: Если входы пользователя «1 ", затем отсортируйте по методу lastName и затем распечатайте в цикле for. Затем вы проверяете, является ли ответ «2», что, очевидно, не потому, что вы все еще находитесь в блоке «if it is 1» (и вы не принимаете никаких дополнительных входных данных). Помните, что когда вы открываете if-блок, все, что вы помещаете внутри него, будет выполнено, если условие истинно. Если вы посмотрите на свой код и причину в потоке, вы увидите, что не соответствует вашим контрольным заявлениям. Для выхода с System.exit (0) в последнем условном операторе, то ответ должен быть 1, 2, 3 и 0.

Также см Leozeo's answer для бизнес-логики кода и рефакторинга для удаления дублирования кода в каждом контрольном заявлении.

+0

Спасибо! Что касается вложенных ifs, то это была функция Format (Shift + Ctrl + F) в Eclipse. Благодарим за недостаток System.exit (0). Я пытался найти способ выйти из программы, и это продолжалось как предложение. Поскольку я новичок в Java, я действительно не знал ничего лучшего, так что это очень полезно указать! Спасибо за ваше время. – IwataFan

+0

@IwataFan Я понял, что вы были смущены, потому что это то, что может смущать более новых программистов. Контрольные утверждения могут быть очень полезными, но они также могут быть путаными, пока вы не рассудите их один за другим. Если вы думаете, что я ответил на ваш вопрос, пожалуйста, примите мой ответ, поскольку он может помочь другим в будущем! – themantimes8

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

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