优化for循环代码

数字职场

大多数还未毕业的学生,认为招聘考试只是知识的测试,这是完全错误的。目前,大部分公司在出招聘题目时,都会从实际出发,结合高校的课程。这类题让人看似简单,当细细思考时,会发现有很多扩展点,例如一个简单的for循环,在实际应用中就要进行优化。

招聘题目:请简述以下两个for循环的优缺点。

// 第一个

for (i=0; i

{

if (condition)

DoSomething();

else

DoOtherthing();

}

// 第二个

if (condition)

{

for (i=0; i

DoSomething();

}

else

{

for (i=0; i

DoOtherthing();

}

题目答案:第一个代码没有什么缺点,优点是:N次,每次都要对condition进行判断。第二个代码没有优点,缺点是判断一次condition,就要对something或Otherthing执行N次。

目的分析

考官出此题的目的,在于测试应聘人员的语言水平以及对编程的扩展性。本题表面上是阅读代码,实际上是对执行效率的判断,这也是对实际工作中代码优化的能力测试。通过此题,考官可以对应聘人员的编程语言水平有个基本了解,更可以判断应聘人员编程的可塑性,以及对代码的优化感觉。

在实际开发过程中,编程所追求的是代码优雅、结构清晰、执行效率高,但是广大在校生都以实现功能为目的进行代码编写与语言学习,这是非常错误的。在各种招聘考试中,对代码优化判断的题目比较多,学生朋友需要有针对性地进行练习。

实际应用

for循环在实际开发中是如何运用的?是如何优化的呢?我们通过两段代码进行说明。代码要达到的目的是,传入一个待过滤的集合,根据其中每一项的属性,返回一个加工后的集合。对于满足isInNToMQueue条件并且onlyNToM 为true的,数据不做更改,否则为其拼接上一个后缀“:N”。

代码1:protected List filterNToMApisForRecon(List instChannelApis, boolean onlyNToM) {

List nToMApis = new ArrayList();

for (String instChannelApi : instChannelApis) {

//N:M队列判断

if (isInNToMQueue(instChannelApi) && onlyNToM) {

nToMApis.add(instChannelApi);

} else {

nToMApis.add(instChannelApi + ":N");

}

}

return nToMApis;

}

点评:算法简洁,结构清晰,代码优雅。在执行过程中,循环在外层,分支在内层,是高效率代码的特征。大家可以看到,代码语句非常简单,没有运用太多的算法,而只是对数据结构形式进行定义要求,产生N:M队列。

代码2:protected List filterNToMApisForRecon(List instChannelApis, boolean onlyNToM) {

List nToMApis = new ArrayList();

if (onlyNToM) {

for (String instChannelApi : instChannelApis) {

//N:M队列判断

if (isInNToMQueue(instChannelApi)) {

nToMApis.add(instChannelApi);

}

}

} else {

for (String instChannelApi : instChannelApis) {

//N:M队列判断

if (isInNToMQueue(instChannelApi)) {

nToMApis.add(instChannelApi +":N");

}

}

}

return nToMApis;

}

点评:语句冗余,结构不清晰。在阅读代码时,不难发现语句的可读性很低,结构非常混乱,这是代码低效率的一大表现。分支语句中,包含循环语句,循环中又包含分支,执行的过程很复杂,这是代码没有优化的表现。