我有一个清单:
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
是否可以将它们合并以使其更简洁明了?
答案 0 :(得分:1)
如果这是目标,您可以采取一些措施来提高代码的清晰度。
使用索引,而不是使用不同的名称。
“数组”没有定义,所以我猜这是一个表格。你可以有类似的东西:
#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; }
您可能会抱怨这并不比第一个版本好,但实际上您可以将这种复杂性隐藏在宏之后:
#define INIT_ARRAYS(a) { int i; for (i=0; i<NB_ARRAYS; i++) a[i] = NULL; }
甚至更好,在内联函数后面:
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;
应该更容易阅读,因此更容易维护。
另外:尝试使用更容易阅读的变量。在这个例子中,我不知道c,i或j代表什么(也不知道它们的定义)。使用5-6个字符来正确命名它们并不花费太多,并且真正有助于代码维护。
答案 1 :(得分:0)
您的代码对我来说有点太伪代码 - 建议非常依赖于您的实际实现。但是,我会提出一些想法。
适用于A
部分:
struct
将允许您执行以下操作:
someStruct temp = {previous_id, a1, a2, a3, a4};
j[i++] = temp;
适用于B
部分:
我假设null
实际上是指一个空数组而不是null
数组,并且您可能有一个固定长度的数组,其中有一个单独的长度指示符用于填充长度。
您可以始终拥有一个长度数组和一个2D主数组,并将整个长度数组memset
设置为0
,而不是逐个设置它们。
答案 2 :(得分: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;
}