为什么我的嵌套for循环无法正常工作?

问题描述:

我现在无法处理我的for循环,我试图比较两个数据,基本上它会比较两个项目,然后它会写网页上的匹配和不匹配。为什么我的嵌套for循环无法正常工作?

我设法写在网页上的比赛,它运作良好。但是在我的不匹配比较中有一个错误。

它写在网页X次的所有数据,这是我的JS代码:

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

我期待它显示错误,而不是所有的字符串。

+0

您需要定义 '匹配' 和 '不匹配' 的好一点。如果一个项目在i1中,而不是在i2中,它是不匹配的,还是位置也很重要? – Triptych 2009-03-01 16:58:59

+0

你是否对i2中的东西感兴趣,但不是'i1'?如果你是那么你缺少它的代码。请参阅下面的答案。 – 2009-03-02 14:38:24

你看到的问题是嵌套for循环的原因。你基本上正在做一个交叉比较:对于i1中的每一个项目,你都将它与i2中的每一个项目进行比较(记住,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,但由于您的评论串的例子包括空格,我不知道,如果你使用任何JavaScript助手库,最好坚持使用嵌套for循环。该片段也不会尝试清除重复内容。

您可能会考虑的另一个优化是您的newArray和newArray2数组包含它们自己的长度属性,因此您不需要将计数传递给HTML编写器。当作者收到这些数组时,它可以请求每一个.length属性知道每个数组有多大。

我有一种感觉,这与使用“!==”,而不是你的第二个做对比“!=”

“!==”是逆“===”,而不是“ ==”。 !==是一个比较严格的比较,它不会进行任何类型的投射。例如(5!='5')为假,其中as(5!=='5')为真。这意味着你可能会推动嵌套循环中的两个数组,因为if(i1 [i] == i2 [j])和if(i1 [i]!== i2 [j])都可能为真与此同时。

不直接相关的问题,但你应该看到这一点: Google techtalks about javascript

也许会启发你:)

+0

你钉了我,我现在实际上看着它。我发现它在黑客新闻 – 2009-03-01 17:15:21

这里的根本问题是一对嵌套循环是不是正确的做法。

您需要遍历每个数据集中的指针。 ONE循环根据需要同时进行。

请注意,找出哪些在不匹配的情况下前进是一个比简单地通过它们更大的问题。发现第一个不匹配不是问题,找到它后很难回到正确的位置。

几件事关于你的问题。首先,您应该使用'!='而不是'!=='来检查不平等。其次,我不确定你为什么将计数减2,表明阵列中可能有重复?!无论如何,你的逻辑是错误的,后来Jarrett纠正了这个错误,但那也不是完全正确/完整的答案。预先阅读。

您的任务听起来像是“给定两组数组i1 & i2找到i1 {交集} i2和i1 {破折号} {UNION} i2 {破折号})(群组理论符号)。在

newArray和newArray2罕见的元素,你需要做到这一点。

1)在两个数组中删除重复项。(为了提高程序的效率以后)(这是不以获得所需的必须的结果 - 你可以跳过它)

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)通过I2传递和追加I2 {}冲刺到I1 {}短跑

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