可逆循环

Joe*_*gue 1 java foreach concept

我一直在尝试一个我想要制作的游戏.我发现除了for循环之外,我有两个相同的方法,这与前者相反.

我试图这样做,所以我可以使用相同的代码向前或向后.我最终得到了:

for (int i = start; i != (finish + 1 * ((start < finish) ? 1 : -1)); i += 1 * ((start < finish) ? 1 : -1))
Run Code Online (Sandbox Code Playgroud)

A)B)我想与大家分享这个概念.

B)我很好奇这种循环的效率.我知道它正在计算目标数量和访问时的实施因素,但我不知道如何测试它.

C)当我在它的时候,我找到了一条线,它可以交换两个变量而不使用临时变量.这需要一点时间来阅读,但这比使用临时更好(代码明智)吗?(下面主要的第3行)

我已经测试了它的功能,它按预期运行.如果第二个数字大于第一个数字,则计数.如果没有,它会倒计时.我的测试代码是:

// A generic loop that can go up or down
import java.io.*;

public class reversable
{
  public static int start = 1;
  public static int finish = 10;

   public static void main(String[] args)
  {
     for (int i = start; i != (finish + 1 * ((start < finish) ? 1 : -1)); i += 1 * ((start < finish) ? 1 : -1))
     {
        System.out.println("i = " + i);
     }
     finish = (start + finish) - (start = finish);  
System.out.println("Finish = " + finish);
System.out.println("Start = " + start);
     for (int i = start; i != (finish + 1 * ((start < finish) ? 1 : -1)); i += 1 * ((start < finish) ? 1 : -1))
     {
        System.out.println("i = " + i);
     }
     finish = 10;
     for (int i = start; i != (finish + 1 * ((start < finish) ? 1 : -1)); i += 1 * ((start < finish) ? 1 : -1))
     {
        System.out.println("i = " + i);
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

根据评论,这是否可以接受:

public static void reversable (int i, int j)
{
  if (i > j) int inc = -1;  // Count down
  else       int inc = 1;  // Count up
  j += inc;
  for (i; i != j; i += inc)
  {
    dostuff();
    morestuff();
    mostuff();
  }
}
Run Code Online (Sandbox Code Playgroud)

mat*_*t b 15

你应该努力编写可读代码,而不是代码在一行中做很多事情或者有花哨的技巧.

如果我和你合作开展一个项目,我可能会想在你第一次读到for循环之后扼杀你,也就是说如果我的脑袋没有爆炸试图先了解它.同意在作业中进行分配.

  • @muntoo:我不反对三元,`?..:..,我也不认为它是邪恶的.但我绝对反对臭臭的代码. (2认同)
  • "总是编码好像最终维护你的代码的人会是一个知道你住在哪里的暴力精神病患者." - 里克奥斯本.从最喜欢的报价列表http://programmers.stackexchange.com/questions/39/whats-your-favourite-quote-about-programming (2认同)

Bil*_*ard 10

如果我在生产中看到这个代码,我会立即将它重构为更具可读性的东西,这可能就像你开始的那样.

想想你想减少代码重复的原因.这是为了使您的代码更易于维护.你觉得你做到了吗?

当我在它的时候,我找到了一条交换两个变量而不使用临时变量的行.这需要一点时间来阅读,但这比使用临时更好(代码明智)吗?

这仅适用于数字类型,所以我发现它不是那么有用.对于不了解技巧的人来说,你的代码可读性较差,从而减慢了代码的维护速度.我不认为值得节省一个临时变量.

  • 我会将"略低于可读性"改为"更不易阅读".凭借大约30年的编程经验,我仍然不相信它在看了10分钟之后就能按预期工作. (2认同)

Mar*_*gus 6

嗯不想成为一块砖,但我想你试着写:

public static void doAction(int i) {
    System.out.println("i = " + i);
}

public static void loopValues(int i, int j) {
    if (i > j) while (i >= j) doAction(i--);
    else       while (i <= j) doAction(i++);;
}

public static void main(String[] args) {
    int start = 1, finish = 10;
    loopValues(start, finish);
    loopValues(finish, start);
}
Run Code Online (Sandbox Code Playgroud)

你有2个循环的原因是效率和你的案例可读性.比较是昂贵的操作,你通常不想添加额外的比较循环只是为了改变它的正常过程.