2012-01-28 14 views
5

私はプログラムを実行して、2つのリンクされたリストの要素を互いに比較しようとしています。これは、2つのforループを実行し、list1の各要素と.equals()を使ってlist2を比較して両方のリストを繰り返し処理することです。 もう1つの方法は、最初のリストを繰り返し実行し、list1.contains(list1.get(i)) が存在するかどうかをチェックすることです。javaドキュメントによれば、.containsは.equalsを内部的に行います。 これが当てはまる場合、後者の場合と比較して前者の実行時間が長いのはどうですか? ドキュメントを誤解しましたか?含まれている場合、内部比較はどのように正確に行われますか?Java:.containsと.equals

  using equals: 
      for (int i = 0; i < list_one.size(); i++) { 
       for (int j = 0; j < list_one.size(); j++) { 
        if (list_one.get(i).equals(list_two.get(j))) { count++; } 

      using contains: 
      for (int i = 0; i < list_one.size(); i++) { 
       if (list_two.contains(list_one.get(i)) == true) { count++; } 
+2

ソースを見ることを検討してください。 –

+0

要素がリストに存在するかどうかを確認するためにforループを使用する必要はありません。 – adatapost

+0

最初のリストのすべての要素が2番目のリストにきれいであるかどうかを調べる必要があります。基本的には、重なっている要素をピックアップします。 – madCode

答えて

1

私はあなたが両方のループでget(j)を使用しているget(i)を見て、と思います。非効率なリンクリストです。 for (String s1 : list1) for (String s2 : list2) ...の速度はcontainsと同じである必要があります。

たとえば、get(3)は最初の要素から開始し、次の3回にリンクする必要があります。 for-eachは、次の要素を指すイテレータを使用します。

5

containsの実装では、equalsがtrueを返すと繰り返し処理が停止するため、探している要素がリストの先頭にある場合は、リスト全体を反復処理しません。あなたのバージョンがそれをしなければ、なぜそれが遅いかを説明します。

PS:どちらの方法でも、実行時間はまだ2次式になります。最初のリストのすべての項目(たとえば、2つのリストを最初にソートしたり、セットを使用するなど)の2番目のリストを反復することを伴わない、この問題を解決するよりスマートな方法があります。

+0

これは意味があります。あなたが私のコードを見たら、それは理由だと思います。そして、はい、私は知っています、様々な他の方法がありますが、私はこのシナリオを具体的に試みていました。 – madCode

関連する問題