Java 如何将此代码优化为更少的代码行

Java 如何将此代码优化为更少的代码行,java,Java,如何优化此代码 我想减少代码行数 public class CoolDude { public static void main(String[] args) { for(int i = 100; i <= 500; ++i) { if(i%5 == 0 && i%11 == 0) { System.out.print("Cool Dude- "); System

如何优化此代码

我想减少代码行数

public class CoolDude {
    public static void main(String[] args) {
        for(int i = 100; i <= 500; ++i) {
            if(i%5 == 0 && i%11 == 0) {
                System.out.print("Cool Dude- ");
                System.out.print(i + "\n");
            } else if (i%5 == 0) {
                System.out.print("Cool - ");
                System.out.print(i + "\n");
            } else if (i%11 == 0) {
                System.out.print("Dude - ");
                System.out.print(i + "\n");
            }
        }
    }

}
公共类CoolDude{
公共静态void main(字符串[]args){

对于(int i=100;i,您可以重新构造决策树,以便只需对循环中的数字进行2次检查(每次检查1次操作和1次比较)。目前,在最佳情况下,决策树需要2次操作和2次比较(
i
可被5和11整除)最坏情况下的4次运算和4次比较(
i
不能被5或11整除),但我们可以将其减少为始终只有2个比较和2个操作,这将导致更高性能的循环。这样,
i
仅对每个数字的5和11进行一次整除性测试,因此无论循环的哪个阶段,只需进行2个操作和2个比较。这是一种opt在尝试优化循环时,应该注意亚胺化

我还将您的
print
方法调用改为
printf
调用,将两个print语句减为1。如果您不熟悉,可以使用以下方法

现在,做所有这些只会将代码的大小减少1行,虽然我相信通过一些巧妙的使用或其他方法可以进一步减少,但作为一般规则,通过行数衡量代码质量是一个糟糕的指标,永远不应该使用,特别是当我们谈论Java这样的编译语言时我可以对下面的代码做很多事情,以牺牲可读性和/或性能为代价来减少行数,但是除了程序员之间的竞争之外,没有什么真正的意义,比如(但即使这样,你也在竞争最低的字符数,而不是行数)

与其追求更短的代码,不如追求最好的代码,这样代码的性能就更高,更少的代码行不一定与性能相关

公共类CoolDude{
公共静态void main(字符串[]args){

对于(int i=100;i,您可以重新构造决策树,以便只需对循环中的数字进行2次检查(每次检查1次操作和1次比较)。目前,在最佳情况下,决策树需要2次操作和2次比较(
i
可被5和11整除)最坏情况下的4次运算和4次比较(
i
不能被5或11整除),但我们可以将其减少为始终只有2个比较和2个操作,这将导致更高性能的循环。这样,
i
仅对每个数字的5和11进行一次整除性测试,因此无论循环的哪个阶段,只需进行2个操作和2个比较。这是一种opt在尝试优化循环时,应该注意亚胺化

我还将您的
print
方法调用改为
printf
调用,将两个print语句减为1。如果您不熟悉,可以使用以下方法

现在,做所有这些只会将代码的大小减少1行,虽然我相信通过一些巧妙的使用或其他方法可以进一步减少,但作为一般规则,通过行数衡量代码质量是一个糟糕的指标,永远不应该使用,特别是当我们谈论Java这样的编译语言时我可以对下面的代码做很多事情,以牺牲可读性和/或性能为代价来减少行数,但是除了程序员之间的竞争之外,没有什么真正的意义,比如(但即使这样,你也在竞争最低的字符数,而不是行数)

与其追求更短的代码,不如追求最好的代码,这样代码的性能就更高,更少的代码行不一定与性能相关

公共类CoolDude{
公共静态void main(字符串[]args){

对于(int i=100;i而言,下面的代码行应该会减少,尽管它似乎运行得不快。它还修正了连字符周围的间距,并可能简化了逻辑

public class CoolDude {
public static void main(String args[]) {
    for (int i = 100; i <= 500; ++i) {
        StringBuilder coolDude = new StringBuilder(15); //15 chars max "Cool Dude - 495"
        if (i % 5 == 0) {
            coolDude.append("Cool ".toCharArray());
        }
        if (i % 11 == 0) {
            coolDude.append("Dude ".toCharArray());
        }
        if (coolDude.length() > 0) {
            System.out.println(coolDude.append(("- " + i).toCharArray()));
        }
    }
}
}
公共类CoolDude{
公共静态void main(字符串参数[]){
对于(int i=100;i 0){
System.out.println(coolDude.append((“-”+i.tocharray());
}
}
}
}
修订: 我的观点是,可以利用每次循环只进行一次mod计算的优势。这在尝试使用StringBuilder和一行代码来节省时间时迷失了方向(正如其他人指出的,这不是一个值得追求的目标)。我通过使用print和println进行了澄清

public class CoolDude {
public static void main(String args[]) {
    boolean printed = false;
    for (int i = 100; i <= 500; ++i, printed = false) {
        if (i % 5 == 0) {
            System.out.print("Cool ");
            printed = true;
        }
        if (i % 11 == 0) {
            System.out.print("Dude ");
            printed = true;
        }
        if (printed) {
            System.out.println("- " + i);
        }
    }
}
}
公共类CoolDude{
公共静态void main(字符串参数[]){
布尔值=假;

对于(int i=100;i而言,下面的代码行应该会减少,尽管它似乎运行得不快。它还修正了连字符周围的间距,并可能简化了逻辑

public class CoolDude {
public static void main(String args[]) {
    for (int i = 100; i <= 500; ++i) {
        StringBuilder coolDude = new StringBuilder(15); //15 chars max "Cool Dude - 495"
        if (i % 5 == 0) {
            coolDude.append("Cool ".toCharArray());
        }
        if (i % 11 == 0) {
            coolDude.append("Dude ".toCharArray());
        }
        if (coolDude.length() > 0) {
            System.out.println(coolDude.append(("- " + i).toCharArray()));
        }
    }
}
}
公共类CoolDude{
公共静态void main(字符串参数[]){
对于(int i=100;i 0){
System.out.println(coolDude.append((“-”+i.tocharray());
}
}
}
}
修订: 我的观点是,可以利用每次循环只进行一次mod计算的优势。这在尝试使用StringBuilder和一行代码来节省时间时迷失了方向(正如其他人指出的,这不是一个值得追求的目标)。我通过使用print和println进行了澄清

public class CoolDude {
public static void main(String args[]) {
    boolean printed = false;
    for (int i = 100; i <= 500; ++i, printed = false) {
        if (i % 5 == 0) {
            System.out.print("Cool ");
            printed = true;
        }
        if (i % 11 == 0) {
            System.out.print("Dude ");
            printed = true;
        }
        if (printed) {
            System.out.println("- " + i);
        }
    }
}
}
公共类CoolDude{
公共静态void main(字符串参数[]){
布尔值=假;
对于(inti=100;i,虽然它非常准确并纠正了您问题中发现的所有信念,但它仍然回答了您的问题,试图将陈述的数量减到最少

public class CoolDude {
  public static void main(String[] args) {
    for (int i = 100; i <= 500; i++)
      if (i % 5 == 0 || i % 11 == 0) // This is the condition where we decide to print something
        System.out.printf("%s%s- %d%n", i % 5 == 0 ? "Cool " : "", i % 11 == 0 ? "Dude " : "", i);
  }
}
公共C类