(Java String.format) 无法将此列设置为固定宽度

(Java String.format) Having trouble making this column a fixed width

首先,如果已经回答了类似的问题,我深表歉意。我试图搜索任何类似的问题,但没有找到任何类似的东西(至少我使用的关键字是这样)。请根据需要对此进行审核!这是我在网站上的第一个 post。

我正在 Java 中练习 String.format,但在使 'Name' 列的元素宽度相同时遇到了问题。如果相关的话,我正在使用 JDK 9。在我下面的代码中,有问题的问题在 for 循环块中。我从他们各自的字符串数组中获取名字和姓氏。我知道如果我将每个全名都变成一个字符串,我可以解决我的问题,但是为了这个练习,为了进一步提高我的 Java 技能,我想知道是否有解决方案问题。谢谢 :)

public static void grades() {
    Random rand = new Random();
    // final grade is calculated based on points achieved out of 45. Rounded to 1 decimal
    String[] rosterFirst = {"Harry", "Seamus", "Dean", "Neville", "Ron", "Dennis"};
    String[] rosterLast = {"Potter", "Finnegan", "Thomas", "Longbottom", "Weasley", "Creevey"};

    System.out.println("2018 Hogwarts Graduating Class Scores \n" +
        String.format("%2$-25s %1$-12s", "Grade", "Name"));

    for (int i = 0; i < rosterFirst.length; i++) {
        double finalGrade = (25 + rand.nextDouble() * 20) / 45 * 100;
        System.out.println(String.format("%s, %-15s %-12.1f", rosterLast[i], rosterFirst[i], finalGrade));
    }
}

输出:

2018 Hogwarts Graduating Class Scores 
Name                      Grade       
Potter, Harry         70.3
Finnegan, Seamus         75.9
Thomas, Dean         96.9
Longbottom, Neville         98.2
Weasley, Ron         58.7
Creevey, Dennis         76.0

(不确定此 post 中的代码输出格式是否错误。如果是,请指正)

目前的问题是姓氏(第一个参数)没有固定的宽度。这将 "mess up" 字符串的其余部分随着姓氏宽度的变化而变化。此外,单独使用 String.format 无法指定附加参数的绝对位置;宽度格式只影响相对位置。

获得所需行为的一种简单方法是将全名指定为具有固定宽度的单个字段,即:

String fullName = rosterLast[i] + ", " + rosterFirst[i];

System.out.println(
  String.format("%-20s %-12.1f", fullName, finalGrade));

现在只有 两个 实际提供给格式的参数,两个 都有指定的固定宽度。让逗号成为全名的 部分 可以避免各个名称组件和逗号之间的固定宽度交互。