是否可以缩短此代码?

时间:2017-05-23 19:30:15

标签: java joptionpane

我不是Java的初学者,但我也不是专家。有没有办法缩短这些代码,以便占用更少的空间和可能更少的行?

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] + ".");

4 个答案:

答案 0 :(得分:3)

让我们一步一步地重构代码

  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-loop替换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&amp;仅使用一次的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);
    

答案 1 :(得分:2)

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());

可能就是这样的。正如您所看到的,您并没有真正保存任何行,但显然代码更灵活,因为它可以占用可变长度的名单。

答案 2 :(得分:1)

您可以执行以下操作:最初分配您不想重复的正常语句。然后循环通过名册。

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传递给您的方法。

答案 3 :(得分:0)

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

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