C 循环中的冗余代码

C 循环中的冗余代码,c,algorithm,loops,C,Algorithm,Loops,我有一份清单: id num1 ... ----------- 1 123 ... 1 456 ... 2 789 ... 2 666 ... 并希望在此基础上创建对象数组: { 1, [123, 456], [...] }, { 2, [789, 666], [...] } 这是我的伪代码: int previous_id = -1; array a1 = null; // B array a2 = null; // B array a3 = null; // B arr

我有一份清单:

id num1 ...
-----------
 1  123 ...
 1  456 ...
 2  789 ...
 2  666 ...
并希望在此基础上创建对象数组:

{ 1, [123, 456], [...] },
{ 2, [789, 666], [...] } 
这是我的伪代码:

int previous_id = -1;
array a1 = null; // B
array a2 = null; // B
array a3 = null; // B
array a4 = null; // B
while (++c) { // c is a pointer pointing to the list
  if (c.id != previous_id && previous_id != -1) {
    j[i++].id = previous_id;   // A
    j[i++].data1 = a1;         // A
    j[i++].data2 = a2;         // A
    j[i++].data3 = a3;         // A
    j[i++].data4 = a4;         // A
    a1 = null;   // B
    a2 = null;   // B
    a3 = null;   // B
    a4 = null;   // B
  }
  a1.add(c.num1);
  a2.add(c.num2);
  a3.add(c.num3);
  a4.add(c.num4);
  previous_id = c.id;
}
j[i++].id = previous_id;   // A
j[i++].data1 = a1;         // A
j[i++].data2 = a2;         // A
j[i++].data3 = a3;         // A
j[i++].data4 = a4;         // A
它正在工作,但带有一些冗余代码,即A和B


是否可以合并它们以使其更加简洁和清晰?

您的代码对我来说有点过于伪代码-建议非常依赖于您的实际实现。不过,我会给出一些想法

对于
A
部分:

C中的结构将允许您执行以下操作:

someStruct temp = {previous_id, a1, a2, a3, a4};
j[i++] = temp;
对于
B
部分:

我假设
null
实际上指的是一个空数组,而不是
null
数组,并且您可能有一个固定长度的数组,其中包含一个用于填充长度的单独长度指示符


您可以始终使用一个长度数组和一个2D主数组,并且
memset
将整个长度数组设置为
0
,而不是逐个设置它们。

刚刚找到了一种合并
a
的方法,避免了必要的重置
B

int previous_id = -1;
array a1 = null; // B
array a2 = null; // B
array a3 = null; // B
array a4 = null; // B
while (++c) { // c is a pointer pointing to the list
  a1.add(c.num1);
  a2.add(c.num2);
  a3.add(c.num3);
  a4.add(c.num4);
  if (c.id != previous_id && previous_id != -1
      || c.islast() ) {
    j[i++].id = previous_id;   // A
    j[i++].data1 = a1;         // A
    j[i++].data2 = a2;         // A
    j[i++].data3 = a3;         // A
    j[i++].data4 = a4;         // A
    if (!c.islast()) {
        a1 = null;   // B
        a2 = null;   // B
        a3 = null;   // B
        a4 = null;   // B
    }
  }
  previous_id = c.id;
}

如果目标是这样的话,您可以做一些事情来提高代码的清晰度

使用索引而不是使用不同的名称

“数组”没有定义,所以我猜它是一个表格。你可以有这样的东西:

  #define NB_ARRAYS 4
  array myArrays[NB_ARRAYS];
这样,您就可以在阵列中循环,并最终在将来随时更改阵列的数量

好的想法是,您不再需要单独列出阵列,一个循环就足够了。因此:

    a1 = null;   // B
    a2 = null;   // B
    a3 = null;   // B
    a4 = null;   // B
变成

    { int i; for (i=0; i<NB_ARRAYS; i++) myArrays[i] = NULL; }
这更清楚

重复使用相同的原则,会导致代码如下所示:

    int previous_id = -1;
    initArrays(myArrays);

    while (++c) 
    { // c is a pointer pointing to the list
       addToArrays(myArrays, c);
       if (c.id != previous_id && previous_id != -1 || c.islast() ) 
       {
           j[i++].id = previous_id;   // A
           setArrays(j, i, myArrays); i+=NB_ARRAYS;
           if (!c.islast()) { initArrays(myArrays); }
       }
    }
    previous_id = c.id;
它应该更容易阅读,因此更容易维护


另外:尝试使用更容易读取的变量。在这个例子中,我不知道c、I或j代表什么(也不知道它们是在哪里定义的)。使用5-6个字符来正确命名它们并不需要花费太多,而且真正有助于代码维护。

为什么称之为冗余?如果代码部分不清楚,则为语句添加注释。你的意思是低效吗?取决于实现语言中
j[i++].data=a
的语义-如果它保持对对象的“活动”引用,那么后续
a.add(c.num)
调用将在该
data
成员中观察到,那么你就可以进行切换。如果
数据
像当时那样复制了
a
,并且从不观察更新,我想不出一个办法offhand@AbhishekBansal更新了我的问题。是的,也许它不是多余的,只是看起来不够简洁。当我完成我的代码时,我觉得应该有某种方法将
A
和/或
B
合并在一起,但不知道怎么做。如果在设置整个对象之前不断递增
I
,并尝试使用
null
数组(除非你指的是空数组),那“工作”如何?消除重复代码块的标准方法:提取方法。好建议。实际上没有这样的a1 a2。。。在我的代码中,它们已经被命名为
phoneNumber
familyName
尊称前缀
。。。c实际上是一个
光标
,需要通过
getContentResolver()初始化。query(…)
++c
光标。moveToNext()
,这些数组实际上是JSONObject、String和JSONArray,它们需要通过不同的方式初始化,例如
新建JSONObject(someString)
新JSONArray(对象)
。。。我只想关注如何改进代码本身的结构,所以写了一个简单的伪代码。
    static inline void initArrays(array* a) { int i; for (i=0; i<NB_ARRAYS; i++) a[i] = NULL; }
    initArrays(myArrays);
    int previous_id = -1;
    initArrays(myArrays);

    while (++c) 
    { // c is a pointer pointing to the list
       addToArrays(myArrays, c);
       if (c.id != previous_id && previous_id != -1 || c.islast() ) 
       {
           j[i++].id = previous_id;   // A
           setArrays(j, i, myArrays); i+=NB_ARRAYS;
           if (!c.islast()) { initArrays(myArrays); }
       }
    }
    previous_id = c.id;