請教各路高手 如何作數據篩選

 

請教各路高手

有兩組數據 需要篩選出不一樣的部分並找出數組的位置

編碼應該如何處理比較好

a[0]=2; a[1]=4; a[2]=6; a[3]=8; a[4]=10;
b[0]=2; b[1]=4; b[2]=10; b[3]=6;
// 需篩選出a組多出不一樣部分的位置[x] x需要為3

//用了雙循環 但是找不出正確的邏輯方式
for(int i=0;i<=10;i++)
   for(int j=0;j<=10;j++)
       if(a[i]!=b[j])
          x=i;           //這樣的結果會是4

//
for(int i=0;i<=10;i++)
   for(int j=0;j<=10;j++)
       if(a[i]==b[j])
          break;
       else
          x=i;           //這樣的結果會是0
 

這個問題困擾了很久 有時候一根筋就是轉不過來 還是請各路高手協助一下 非常感謝

因為實際使用的碼比較亂 放出來不好看 所以用簡單的方式比喻 請高手們諒解

 

如果你要求的是,“找出A组与B组首个差异值的位置“,那么

  • 如果两组数组的长度一样,则

int x = -1; // 初始化为-1,表示没有找到目标。
int S = ArraySize(a);

for( int i=0; i<S && x<0; ++i ) if ( a[i] != b[i] ) x=i;

MessageBox( x ); // 显示结果

  • 如果两数组长度不一,且已知a数组长度大于b数组,则

int LA = ArraySize(a);
int LB = ArraySize(b);
int x = -1;

for (int i=0; i<LA && x<0; ++i )
        if ( i == LB ) x=i;
        else if ( a[i] != b[i] ) x=i;

MessageBox( x );
 

有兩組數據 需要篩選出不一樣的部分並找出數組的位置

你这表述就令人费解,难怪你困扰很久。

建议你逆向思维,先求同,找出数组A与B的交集C,再用A与C比较,B与C比较。

 
Tang Sun:

如果你要求的是,“找出A组与B组首个差异值的位置“,那么

  • 如果两组数组的长度一样,则

  • 如果两数组长度不一,且已知a数组长度大于b数组,则

謝謝指導 仔細一看 兩種方式應該都行的通

整理一下套進去試看看

 
Ziheng Zhuang:

有兩組數據 需要篩選出不一樣的部分並找出數組的位置

你这表述就令人费解,难怪你困扰很久。

建议你逆向思维,先求同,找出数组A与B的交集C,再用A与C比较,B与C比较。

我使用的求同的方式

for(int i=0;i<=10;i++)
   for(int j=0;j<=10;j++)
       if(a[i]==b[j])
          break;     //如果只跳出j循環 那結果應該就對了 但是break是跳出到i的循環 所以結果是錯的
       else
          x=i;  

求異的方式肯定也是錯的 因為用了雙循環


無論如何 謝過高手的指導 

 

是不是这样的:A中的每个元素,如果B中没有,那就记录该元素在A中的索引?

//A中的每个元素,如果B中没有,那就记录该元素在A中的索引,保存索引到数组res中
int CreateResSet(const double &a[],const double &b[],int &res[])
{
   int len1 = ArraySize(a);
   int len2 = ArraySize(b);
   int cnt=0;
   bool found = false;
   for(int i=0; i<len1; i++)
   {
      found = false;
      for(int j=0; j<len2; j++)
      {
         if(a[i]==b[j])
         {
            found = true;
            break;
         }
      }

      if(!found)
      {
         cnt++;
         ArrayResize(res,cnt);
         res[cnt-1]=i;
      }
   }

   return(cnt);
}
 
Ziheng Zhuang:

是不是这样的:A中的每个元素,如果B中没有,那就记录该元素在A中的索引?

謝謝高手提供珍貴的代碼

我嘗試帶進去 看看結果會不會是我要的 再次感謝

 

刚才再看了一次楼主的问题,以及跟帖,似乎楼主要解决的是“找出A组中其值不在B组的元素的下标”,那么6#的代码就符合楼主要求了,代码清晰,有条理,应该可用的了。

我贴的那份代码是用来找首个差异值的位置(按下标次序来算),不是按元素的值来找出全体差异值的位置,与楼主要求不一致,是我的理解与楼主需求有偏差,呵呵,请楼主自行理解和采用。

 
Tang Sun:

刚才再看了一次楼主的问题,以及跟帖,似乎楼主要解决的是“找出A组中其值不在B组的元素的下标”,那么6#的代码就符合楼主要求了,代码清晰,有条理,应该可用的了。

我贴的那份代码是用来找首个差异值的位置(按下标次序来算),不是按元素的值来找出全体差异值的位置,与楼主要求不一致,是我的理解与楼主需求有偏差,呵呵,请楼主自行理解和采用。

“找出A组中其值不在B组的元素的下标” 這是我實際的需求沒錯 我在文字敘述上不夠清晰 真不好意思

因為我自身的代碼比較混亂 只提出部分片段 比較方便描述問題

各位提供的解決方案 我還需要一些時間將代碼加進去

無論如何 感謝各位鼎力的協助

 

目前自己找到的方法是

a[0]=2; a[1]=4; a[2]=6; a[3]=8; a[4]=10;
b[0]=2; b[1]=4; b[2]=10; b[3]=6;

//
for(int i=0;i<=10;i++)
   for(int j=0;j<=10;j++)
       if(a[i]==b[j])     //一旦a數組符合b數組其中一個時 進行下一個搜尋
          i=i+1 ;
       else
          x=j;           

按理講 我要找的位置 x 應該要從 i 裡面去選擇

再從a[i]找除對應的數據 而不是從 j 裡面去找出 x

但是反覆測試後 竟然從 j 去對應成 i 時可以找到正確答案

我猜 else後面的 j 應該也是等於 i 吧

不明就理的 就找到了可能是錯誤的答案

目前反覆測試了功能 確實是我想要的結果