是否可以缩短此代码?

Is it possible to shorten this code?

我不完全是 Java 的初学者,但我也不是专家。有没有什么方法可以缩短这段代码,使其占用更少 space 甚至可能更少的行数?

JOptionPane.showMessageDialog(null, "The student's names are: " 
  + roster[0][0] + " " + roster[1][0] + ", " 
  + roster[0][1] + " " + roster[1][1] + ", " 
  + roster[0][2] + " " + roster[1][2] + ", and " 
  + roster[0][3] + " " + roster[1][3] + ".");

您可以执行以下操作: 最初分配您不想重复的普通语句。然后遍历花名册。

String rosterString= "The student's names are: ";
for(int i=0;i<= roster.length;i++){
    for(int j=0;j<= roster[i].length;j++){
         rosterString += (roster[i][j] + " ");
         if (i == 1 && j < 2) {
             rosterString += ", ";
         }
         else if (i == 1 && j == 2) {
             rosterString += ", and";
         }
         else if (i == 1 && j == 3) {
             rosterString += ".";
         }
         else {
             rosterString += " ";
         }
    }
}

然后将 rosterString 传递给您的方法。

String rosterString = "";
for(int i = 0; i < roster[0].length; i++) {
    rosterString += roster[0][i] + " " + roster[1][i] + ", ";
}

该代码将创建一个包含名称和逗号的字符串。然后您可以添加 if 语句来检查它是否接近尾声以将 , 更改为 and.

StringBuilder message = new StringBuilder("The student's names are: ");
for (int i = 0; i < roster[0].length; i++) {
    message
        .append(roster[0][i])
        .append(" ")
        .append(roster[1][i]);
    if (i < roster[0].length - 1)
        message.append(", ");
    if (i == roster[0].length - 2)
        message.append("and ")
}
message.append(".");
JOptionPane.showMessageDialog(null, message.toString());

可能是这样的。如您所见,您并没有真正保存任何行,但显然代码更灵活,因为它可以考虑可变长度的花名册。

让我们一步步重构代码

  1. 引入变量以消除重复。

    T[] col1 = roster[0];
    T[] col2 = roster[1];
    
    String content = col1[0] + " " + col2[0] + ", "
            + col1[1] + " " + col2[1] + ", "
            + col1[2] + " " + col2[2] + ", and "
            + col1[3] + " " + col2[3] + ".";
    
    JOptionPane.showMessageDialog(null,"The student's names are: " + content);
    
  2. 将字符串连接分成多个赋值,那么除最后一个赋值外所有赋值都相同。

    int i = 0;
    String content = "";
    content += col1[i] + " " + col2[i] + ", ";i++;
    content += col1[i] + " " + col2[i] + ", ";i++;
    content += col1[i] + " " + col2[i] + ", ";i++;
    content += "and " + col1[i] + " " + col2[i] + ".";i++;
    
  3. 使用三元运算符使多重赋值一致。

    int i = 0;
    String content = "";
    content+= (i==3?"and ":"") + col1[i]+" "+col2[i] + (i==3?".":", "); i++;
    content+= (i==3?"and ":"") + col1[i]+" "+col2[i] + (i==3?".":", "); i++;
    content+= (i==3?"and ":"") + col1[i]+" "+col2[i] + (i==3?".":", "); i++;
    content+= (i==3?"and ":"") + col1[i]+" "+col2[i] + (i==3?".":", "); i++;
    
  4. 使用 while 循环删除重复项。

    int i = 0;
    String content = "";
    while(i<=3) {
        content+= (i==3?"and ":"") + col1[i]+" "+col2[i] + (i==3?".":", "); 
        i++;
    }
    
  5. 用 for 循环替换 while 循环。

    String content = "";
    for (int i = 0; i <= 3; i++) {
        content+= (i==3?"and ":"") + col1[i]+" "+col2[i] + (i==3?".":", ");
    }
    
  6. 引入变量使代码更易读。

    String content = "";
    for (int i = 0; i <= 3; i++) {
        String prefix = i == 3 ? "and " : "";
        String current = col1[i] + " " + col2[i];
        String suffix = i == 3 ? "." : ", ";
        content += prefix + current + suffix;
    }
    
  7. 内联只使用一次的变量col1 & col2:

    String content = "";
    for (int i = 0; i <= 3; i++) {
        String prefix = i == 3 ? "and " : "";
        String current = roster[0][i] + " " + roster[1][i];
        String suffix = i == 3 ? "." : ", ";
        content += prefix + current + suffix;
    }
    
  8. 将幻数3替换为常量,最终代码如下:

    final int last = 3;
    String content = "";
    for (int i = 0; i <= last; i++) {
        String prefix = i == last ? "and " : "";
        String suffix = i == last ? "." : ", ";
        String current = roster[0][i] + " " + roster[1][i];
        content += prefix + current + suffix;
    }
    
    JOptionPane.showMessageDialog(null, "The student's names are: " + content);