2009-03-01 6 views
1

for 루프를 처리하는 데 문제가 있습니다. 두 데이터를 비교하려고합니다. 기본적으로 2 개 항목을 비교 한 다음 일치 항목과 불일치를 웹 페이지에 작성합니다.중첩 된 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에서 다시 시작한다는 것을 기억하십시오. 두 개의 루프가 병렬로 실행되지 않습니다.

하나의 배열을 다른 배열과 비교할 수 있기를 원한다는 점에서 아래 의견에서 알 수 있습니다. 각 배열의 항목이 다른 순서로 있어도 원래 제안을 편집했습니다. 아래의 스 니펫은 두 배열 사이의 차이점을 표준화하지는 않습니다 ... 그 점이 중요한지는 알 수 없습니다. 또한 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에 해시 테이블을 사용하는 것이 좋습니다,하지만 귀하의 코멘트 문자열의 예 이후 공백을 포함하고 모르겠어요 수 , 중첩 된 for 루프를 고수하는 것이 가장 좋습니다. 스 니펫은 또한 중복을 제거하려고 시도하지 않습니다.

고려할 수있는 또 다른 최적화는 newArray 및 newArray2 배열이 고유 한 길이 속성을 포함하므로 HTML 작성기로 개수를 전달할 필요가 없다는 것입니다. 작성자가 배열을 받으면 각 배열에 .length 속성을 요청하여 각 배열의 크기를 알 수 있습니다.

+0

안녕하세요 Jarret, 멋진 답변을 보내 주셔서 감사합니다. 문제가 있습니다. 주문과 관계없이 단어를 한 단어 씩 비교하고 싶습니다. 예 : 1) 어퍼 데크 뉴저지 네츠 빈스 카터 2) NBA 올스타 비닐 뉴저지 네츠 위의 코드는 불일치를 반환합니다.이 점에 대해서는 언급하지 않으셔서 죄송합니다. –

+0

아, 잡았다! 걱정하지 마라.이 경우 둥지를위한 for-loop 방식이 매우 가깝다. 위의 코드를 편집하여 사용자의 요구를 충족시킬 수있는 방법을 조정할 수 있습니다. –

+0

일치하는 것이 발견되면'break'를 추가 할 수 있습니다. – Gumbo

0

내가하지 ""=== "이!"== "대신 사용하여 두 번째 비교과 관련이 있다는 느낌"! = "

가!"== "의 역이다가 == ". ! ==는 타입 캐스팅을하지 않는보다 엄격한 비교입니다.

예를 들어 (5! = '5')는 거짓이며, 여기서 as (5! == '5')는 참입니다. 즉, if (i1 [i] == i2 [j]) 및 if (i1 [i]! == i2 [j])가 모두 참일 수 있으므로 중첩 루프에서 두 배열을 모두 푸시 할 가능성이 있습니다. 동시에.

1

직접 질문에 관련이 있지만이를 볼 수 없음 : Google techtalks about javascript

는 아마 당신을 계몽 것입니다 :)

+0

당신이 나를 못 박았습니다. 저는 지금 그것을 실제로보고 있습니다. hackersnews에서 찾았습니다. –

0

기본 문제는 한 쌍의 중첩 루프가 이 아니고 올바른 접근 방식이라는 것입니다.

각 데이터 세트를 통해 포인터를 이동해야합니다. ONE 필요에 따라 둘 다 진행하는 루프.

불일치가 발생할 경우 어떤 것을 진행할 것인가하는 것은 단순히 걷는 것보다 훨씬 더 큰 문제입니다. 첫 번째 불일치를 찾는 것이 문제가되지 않는다는 것을 발견 한 후에 다시 궤도에 진입하는 것은 문제가되지 않습니다.

1

질문에 대한 몇 가지. 먼저 '! =='대신 '! ='을 사용하여 불평등을 검사해야합니다. 두 번째로 왜 2를 줄이는 지 확신 할 수 없지만 배열에 중복이있을 수 있음을 나에게 알립니다. 어쨌든 당신의 논리는 Jarrett에 의해 나중에 수정되었지만 틀린 것이 었습니다. 그러나 그것은 완전히 정확한/완전한 대답이 아니 었습니다. 미리 읽어보십시오.

당신의 과제는 "i1 {intersection} i2와 i1 {dash} {UNION} i2 {dash}) (그룹 이론 표기법)를 찾기 위해 i2 & i2 배열 두 개를 주어진 것처럼 들립니다. newArray 및 newArray2에 드문 요소에.

이 작업을 수행해야합니다.

1) 두 배열에서 중복을 제거합니다.() 나중에 프로그램의 효율성을 개선하기 위해 (이 원하는 얻을 수있는 MUST 아니다 결과 - 건너 뛸 수 있음)

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

(removeDuplicate에 대한 구현이 제공되지 않음).

2) i1을 통과하고 i1 {대쉬} 및 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; 
       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); 
관련 문제