2016-04-08 15 views
0

私は基本的な携帯電話アプリケーションを作成しようとしています。私は電話で既存の連絡先を照会する機能を実装しようとしています(しかし失敗しています)。私は連絡先を含むArrayListオブジェクトを返すメソッドを作成してこれを行いました。これは、特定の連絡先が存在するかどうかを調べるために(forループを使用して)検索し、その場合はArrayListに追加することによって動作すると考えられます。その後、メソッドはクエリの結果だけを含むArrayListオブジェクトを返す必要があります。しかし、自分のコードをテストすると、クエリに一致するかどうかにかかわらず、すべての連絡先がArrayListに追加されています。ここに私のコードの一部抜粋です:当然そうArrayListにユニークなオブジェクトを追加する

public static void main(String[] args) { 
     char c= 'A'; 

     for (int i = 0; i < 10; i++) { 
      //Create contacts with unique data 
      phone.addContact(Contact.createContact("Contact"+c++, "07"+i)); 
     } 

     System.out.println(phone.queryContacts("VoidContact")); //Dubious entry 
     System.out.println(phone.queryContacts("ContactB")); //This entry exists 
    } 

私のコード(Main.java)をテストする

Phone.java

private ArrayList<Contact> contacts; 

public Phone() { 
    this.contacts = new ArrayList<>(); 
} 

public ArrayList<Contact> queryContacts(String contactName) { 
     ArrayList<Contact> contactsList = new ArrayList<>(); 

     for (Contact contact : this.contacts) { 
      if (this.findContact(contactName)) 
       contactsList.add(contact); 
     } 
     return contactsList; 
    } 

    private boolean findContact(String contactName) { 
      for (Contact contact : this.contacts) { 
       if (contact.getName().equals(contactName)) 
        return true; 
      } 
      return false; 
} 

が、私は呼び出し時に何も出力を受けていません「VoidContact」パラメータを持つphone.queryContacts()メソッド。ただし、正当なパラメータ「ContactB」、とそれを呼び出すだけではなく、ただ一つのコンタクトを受信すると、私は(私は私のContactクラスでObject.toString()をオーバーライドしていることに注意してください)以下の出力が得られます。

Name: 'ContactA' Number: 070 
Name: 'ContactB' Number: 071 
Name: 'ContactC' Number: 072 
Name: 'ContactD' Number: 073 
Name: 'ContactE' Number: 074 
Name: 'ContactF' Number: 075 
Name: 'ContactG' Number: 076 
Name: 'ContactH' Number: 077 
Name: 'ContactI' Number: 078 
Name: 'ContactJ' Number: 079 

マイ質問;入力されたパラメータに基づくユニークな連絡先とは対照的に、すべての連絡先を出力する理由は何ですか?あなたのレスポンスに事前に感謝します。

+2

equalsメソッドをオーバーライドする必要がありますか?あなたが投稿したものでは 'contactsList.add(contact)'を実行するときに 'contactsList'が決して定義されていないからです。したがって、これはうまくコンパイルするべきではありません。 –

+0

@ VicSeedoubleyew Dunnoどのように私はそれを逃した。私は不足しているコードを追加しました。ありがとう –

+0

あなたは歓迎です:) –

答えて

2

まず、あなたのコードはコンパイルされません。contactsList変数はどこにも定義されていません。

第二には、あなたのロジックは欠陥がある:

for (Contact contact : this.contacts) { 
     if (this.findContact(contactName)) 
      contactsList.add(contact); 
    } 
    return contactsList; 

はのは、英語でこれを翻訳してみましょう:リストはcontactNameが含まれている場合、各連絡先、連絡先をリストに追加されます。リストに連絡先の名前が含まれている場合は、すべての連絡先がリストに追加されます。そうでない場合は、追加されません。 Javaの8と

public List<Contact> queryContacts(String contactName) { 
    List<Contact> contactsList = new ArrayList<>(); 
    for (Contact contact : this.contacts) { 
     if (contact.equals(contactName)) { 
      contactsList.add(contact); 
     } 
    } 
    return contactsList; 
} 

または、::

public List<Contact> queryContacts(String contactName) { 
    return contacts.stream() 
        .filter(contact -> contact.getName().equals(contactName)) 
        .collect(Collectors.toList()); 
} 
+0

コメントありがとうございます。しかし、私は今それが間違っていることを知っていますが、私はまだ元の論理の欠陥を理解することに失敗していますか? –

+0

連絡先にアリス、ボブ、カール、ドミニックが含まれているとします。カールという連絡先をすべて探しています。 Aliceの連絡先とループを開始します。そしてfindContact(Carl)を呼び出します。 Carlがリストに存在するので、trueを返します。したがって、現在の連絡先、Aliceをリストに追加します。その後、ループはBobに続きます。カールは連絡先に存在しますか?はい、現在の連絡先、Bobをリストに追加しましょう。等 –

+0

ああ、大きな説明。本当にありがとう、本当にそれをクリアするのに役立っています –

1

最高sulutionがある

は、あなたが実際に欲しいのは、与えられた名前を持つリストで連絡先を見つけた方法であり、 HashSetを使用する

Set<Contact> collection=new HashSet<Contact>(); 
//... 
for (Contact contact : this.contacts) { 
    collection.add(concat); 
} 

とにかく、ArrayLイスト:両方のソリューションで

for (Contact contact : this.contacts) { 
    if(!collection.contains(contact){ 
     collection.add(concat); 
    } 
} 

あなたは正確にあなたがしようとしているコードを掲載しているContact.class

public boolean equals(Object o){ 
    if(o == null) return false; 
    if(o insteadof Contact){ 
     Contact c=(Contact)o; 
     return c.name.equals(this.name); 
    } 
    return false; 
} 
関連する問題