2017-02-20 9 views
-1

私のコードはパッケージ内にあり、2つの別々の.javaファイルに分割されています。これは、ArrayListをソートする方法のオプションのリストを出力します。このリストは、正しい番号を入力することで選択できます。しかし、何らかの理由で入力後にソートされたリストは表示されません。誰も助けることができますか?ここでArrayListをソートする方法をユーザーに尋ねるJava ArrayListソートプログラムの完了に問題がある

は私のカスタム・オブジェクト・クラスは、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

オプションごとに連絡先リストを印刷しようとしています。それを一度呼び出すほうがよいでしょう。また、年齢をキャプチャするために、コンストラクタの定義を更新する必要が

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

以下に示すコードを使用してpromptForOptionのAPIの定義を置き換えます。

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"であるかどうかを確認していますが、これは明らかに "1 'ブロックであれば(まだ入力を受け付けていない)ためです。 ifブロックを開くと、その中に置かれたものは、条件が真であれば実行されることに注意してください。あなたのコードを見て、流れを推論すれば、あなたはコントロールステートメントについて何が欠陥かを知ることができます。あなたの最後の条件文ではSystem.exit(0)で終了するには、答えは1、2、3 とも0

、コードの重複を除去するために、ビジネス・ロジック・コードとリファクタリングのためLeozeo's answerを見なければならないであろう各制御ステートメントで

+0

ありがとうございました!ネストされたifについては、EclipseでFormat関数(Shift + Ctrl + F)を使用していました。 この欠陥をSystem.exit(0)で指摘していただき、ありがとうございます。私はプログラムを終了するための何らかの方法を見つけようとしていましたが、それは提案として出てきました。私はJavaの方が新しいので、実際にはそれほど良く分かりませんでしたので、これは非常に参考になります! お時間をいただきありがとうございます。 – IwataFan

+0

@IwataFan私はこれがあなたが混乱していたものだと考えました。なぜなら、それは新しいプログラマーに混乱させるものかもしれないからです。制御文は非常に役立つかもしれませんが、あなたがそれらを一つずつ調べるまで混乱するかもしれません。私があなたの質問に答えたと思うなら、将来的に他人を助けるかもしれないので、私の答えを受け入れてください! – themantimes8

関連する問題