2009-03-01 8 views
1

私はforループを扱うのに問題があります.2つのデータを比較しようとしていますが、基本的には2つのアイテムを比較し、一致と不一致をWebページに書き込みます。入れ子のforループが期待通りに機能しないのはなぜですか?

私はウェブページ上の試合を書き込むことができたが、それはうまくいっていた。しかし、不一致のバグがあります。

function testItems(i1, i2) { 
    var newArray = []; 
    var newArray2 = []; 
    var count = 0; 
    var count2 = 0; 
    for(var i = 0; i < i1.length; i++) { 
     for(var j = 0; j < i2.length; j++) { 
      if(i1[i] == i2[j]) { 
       newArray.push(i1[i]); 
       count++; 
      } if (i1[i] !== i2[j]) { 
       newArray2.push(i1[i]); 
       count2++; 
      } 
     } 
    } 
    count-=2; 
    count2-=2 
    writeHTML(count,count2, newArray, newArray2); 
} 

結果が不一致のために恐ろしいことでした:

alt text http://www.picamatic.com/show/2009/03/01/07/44/2523028_672x48.jpg

が、私はそれを表示するように期待していたそれは、ウェブページのX時間にすべてのデータを書いた

は、ここに私のJSコードです間違いではなく、すべての弦。

+0

あなたが '一致' と '不一致' 少し良くを定義する必要がI2を通過し、I1 {ダッシュ}にI2 {ダッシュ}を追加します。アイテムがi1にあり、i2にないアイテムが不一致であるか、またはポジションも重要ですか? – Triptych

+0

また、i2 'ではなく「i1」にあるものに興味がありますか?あなたがそうしていれば、それのためのコードがありません。下の私の答えを見てください。 –

答えて

3

あなたが見ている問題は、ループの入れ子になったのです。あなたは本質的に相互比較を行っています:i1のすべてのアイテムについて、i2のすべてのアイテムと比較しています(iが前進するたびにjが0で始まることを忘れないでください。

私は以下のコメントから、ある配列を他の配列と比較できるようにしたいと考えているので、それぞれの項目が異なる順序であっても、私は元の提案を編集しました。以下のスニペットは2つの配列の間の違いを正規化していないことに注意してください...それが懸念されているかどうかは分かりません。また、i1とi2を比較するにすぎないことにも注意してください.i1とi2、i2とi1の両方ではなく、タスクを少し難しくします。代替案として

function testItems(i1, i2) { 

    var newArray = []; 
    var newArray2 = []; 

    for (var i = 0; i < i1.length; i++) { 
     var found = false; 
     for (var j = 0; j < i2.length; j++) { 
      if (i1[i] == i2[j]) found = true; 
     } 
     if (found) { 
      newArray.push(i1[i]) 
     } else { 
      newArray2.push(i1[i]) 
     } 
    } 
} 

、あなたはインデックスI1/I2にハッシュテーブルを使用することを検討しますが、コメント内の文字列の例ので、スペースを含めると、あなたが任意のjavascriptのヘルパーライブラリを使用している場合、私は知りませんでしたおそらくネストされたforループに固執するのが最善です。スニペットは重複を取り除く試みもしません。

また、newArray配列とnewArray2配列に独自のlengthプロパティが含まれているため、HTMLライターにカウントを渡す必要はありません。ライターが配列を受け取ると、各配列に.lengthプロパティを問い合わせて、それぞれの大きさを知ることができます。

+0

こんにちはジャレット、 あなたの素晴らしい答えをありがとう。 問題があります。その順序に関係なく、単語ごとに単語を比較したいと思います。 例:1)アッパーデッキニュージャージーネッツヴィンスカーター2)NBAオールスタービニールニュージャージーネッツ 上記のコードは、不一致を返します..これを言及して申し訳ありません。 –

+0

ああ、つまらない!心配する必要はありません。その場合、ネストforループアプローチは非常に近いです。上記のコードを編集して、自分のニーズに合ったものを調整する方法を反映させました。 –

+0

一致が見つかった場合は、 'break'を追加することができます。 – Gumbo

0

私は「!==」の代わりに「!=」

「!==」「===」の逆が」、ではない、これは使用して第2の比較に関係しているという感覚を持っています== "。 !==は、型キャストを行わないより厳密な比較です。

たとえば、(5!= '5')が偽の場合、as(5!== '5')が真であるとします。つまり、if(i1 [i] == i2 [j])とif(i1 [i]!== i2 [j])の両方が真である可能性があるため、ネストされたループの両方の配列にプッシュできる可能性があります同時に。

1

が直接質問に関連がありますが、これを見るべきではない:Google techtalks about javascript

は、多分それはあなたを啓発します:)

+0

あなたは私を釘付け、私は実際にそれを今見ている。私はhackersnewsでそれを見つけた –

0

根本的な問題は、ネストされたループのペアがNOT正しいアプローチであることです。

各データセットにポインタを移動する必要があります。 ONEループは必要に応じて両方向に進みます。

ミスマッチが発生した場合に前進するかどうかを判断することは、単に歩くことよりもはるかに大きな問題であることに注意してください。最初のミスマッチを見つけることは問題ではなく、難しいと思った後に元に戻っています。

1

あなたの質問についてのいくつかの事柄。まず、 '!=='の代わりに '!='を使用して、不等式をチェックする必要があります。二番目に私はなぜあなたが2でカウントを減らしているのかわからない、配列に重複があるかもしれないことを私に示唆している?いずれにせよ、あなたのロジックは間違っていましたが、後でJarrettによって修正されましたが、それはまったく正しい/完全な答えでもありませんでした。先読み。

あなたのタスクは、 "i1 {intersection} i2とi1 {ダッシュ} {UNION} i2 {ダッシュ})(グループ理論表記法)を見つけるためにi2 & i2の2つの配列が与えられたとします。 NEWARRAYとnewArray2では珍しい要素に。

あなたはこれを実行する必要があります。

1)両方の配列で重複を削除します。()後にプログラムの効率を改善するために(これは、希望取得することMUSTではありません結果 - あなたはそれをスキップすることができます)

i1 = removeDuplicate(i1); 
i2 = removeDuplicate(i2); 

(removeDuplicateの実装は指定されていません)。

2)i1を通​​過し、i1 {dash}とi1 {intersection} i2を見つけます。

var newArray = []; 
    var newArray2 = []; 

    for (var i = 0; i < i1.length; i++) 
    { 
     var found = false; 
     for (var j = 0; j < i2.length; j++) 
     { 
      if (i1[i] == i2[j]) 
      { 
       found = true; 
       newArray.push(i1[i]); //add to i1 {intersection} i2. 
       count++; 
       break; //once found don't check the remaining items 
      } 
     } 

     if (!found)   
     { 
      newArray2.push(i1[i]); //add i1{dash} to i1{dash} {UNION} i2{dash} 
      count2++;[   
     } 
    } 

3)

for(var x=0; x<i2.length; x++) 
{ 
    var found = false; 

    //check in intersection array as it'd be faster than checking through i1 
    for(var y=0; y<newArray.length; y++) { 
     if(i2[x] == newArray[y]) 
     { 
     found = true; 
     break; 
     } 
    } 

    if(!found) 
    { 
     newArray2.push(i2[x]); //append(Union) a2{dash} to a1{dash} 
     count2++; 
    } 
} 

writeHTML(count,count2, newArray, newArray2);