Java中如何正确使用制表符输出对齐的5x5二维数组网格
问题根源
你现在输出异常是因为printCard方法里使用了System.out.println()打印每个元素,这个方法会在输出内容后自动追加换行,同时你额外加了一次换行调用,导致每个元素都单独占两行。另外你没有控制换行时机,应该遍历完一行的5个元素之后再换行,而不是每个元素都换行。
优先使用制表符的实现方案
直接修改printCard方法即可,制表符会自动适配宽度对齐,后续你把元素替换为XX也能正常适配:
public static void printCard(String[][] card1, String[][] card2) { System.out.println(player1); // 建议把i、j声明为循环局部变量,不要用全局变量避免污染 for(int i = 0; i < card1.length; i++) { for(int j = 0; j < card1[i].length; j++) { // 同一行元素用制表符分隔,不换行 System.out.print(card1[i][j] + "\t"); } // 整行元素打印完成后再统一换行 System.out.println(); } // 需要打印玩家2的卡片可以放开下面的注释 /* System.out.println("\n" + player2); for(int i = 0; i < card2.length; i++) { for(int j = 0; j < card2[i].length; j++) { System.out.print(card2[i][j] + "\t"); } System.out.println(); } */ }
可选:和示例完全一致的空格对齐方案
如果不需要制表符,想要和你给出的期望输出完全匹配的2位宽度右对齐效果,可以把打印语句替换为格式化输出:
// 每个元素固定占2个字符宽度,右对齐,后面加空格分隔 System.out.printf("%2s ", card1[i][j]);
小提示
你代码里声明的List<Scanner> usedNums泛型明显不符合业务逻辑(你要存的应该是已使用的数字,不是Scanner对象),这个属于业务逻辑问题,和本次打印无关,后续可以自行调整。
内容的提问来源于stack exchange,提问作者Anas
相关产品推荐
相关产品推荐

