[英]Bar chart using java
我应该制作一个程序,要求用户输入分数并将其显示在字符为 * 的条形图中。 这是我的代码,但我想让它更短更简洁。 有人可以帮我重新格式化吗? 谢谢你。
是否可以使用数组来做到这一点?
java.util.Scanner;
public class casa2
{
public static void main (String[] args) {
Scanner input = new Scanner(System.in);
int art, bob, cal, dan, eli;
System.out.print("Enter points earned by Art >> ");
art = input.nextInt();
System.out.print("Enter points earned by Bob >> ");
bob = input.nextInt();
System.out.print("Enter points earned by Cal >> ");
cal = input.nextInt();
System.out.print("Enter points earned by Dan >> ");
dan = input.nextInt();
System.out.print("Enter points earned by Eli >> ");
eli = input.nextInt();
System.out.println("\nPoints for Game\n");
System.out.print("\nArt ");
for (int num = 0; num < art; num += 1)
{
System.out.print("*");
}
System.out.print("\nBob ");
for (int num = 0; num < bob; num += 1)
{
System.out.print("*");
}
System.out.print("\nCal ");
for (int num = 0; num < cal; num += 1)
{
System.out.print("*");
}
System.out.print("\nDan ");
for (int num = 0; num < dan; num += 1)
{
System.out.print("*");
}
System.out.print("\nEli ");
for (int num = 0; num < eli; num += 1)
{
System.out.print("*");
}
}
}
更紧凑? 是的。 使用数组? 是的。 但通常最好使用Java Collections而不是仅仅使用数组。
与其重复仅因玩家姓名而异的行,不如预先收集这些玩家姓名。 然后循环该名称集合。 这样您就无需重复其他代码行。 将来,当您添加或删除玩家时,您可以在代码中的一个地方而不是整个代码中更改玩家。
如果我们预先定义玩家,我们不妨跟踪他们的分数以及该名称。 跟踪这样的键值对的集合是Map
的工作。 玩家的名字是关键,他们的点数是价值。
我们首先使用Map.of
定义我们的 map,因为它具有简单的文字语法。 但该方法返回一个不可修改的 map。 因此,让我们将 map 提供给另一个Map
实现的构造函数。 如果我们想保持 map 按键的自然顺序排序,请使用NavigableMap
实现,例如TreeMap
。
当我们从用户那里收集每个玩家的积分数据输入时,我们用玩家的积分更新 map 以替换初始值零。
要生成我们的星线以图形方式显示点数,我们不需要编写循环。 String
class 在 Java 11 及更高版本中提供了repeat
方法。
此代码的某些行可以进一步组合。 但请谨慎行事。 我推荐简短的简单线条。 这通常使代码更易于阅读和调试。 这通常使编译器更容易优化代码。
package org.vaadin.example;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Scanner;
import java.util.TreeMap;
public class Casa
{
public static void main ( String[] args )
{
// Setup
NavigableMap < String, Integer > mapPlayerToPoints =
new TreeMap <>(
Map.of(
"Art" , 0 ,
"Bob" , 0 ,
"Cal" , 0 ,
"Dan" , 0 ,
"Eli" , 0
)
);
// Input
Scanner input = new Scanner( System.in );
for ( String player : mapPlayerToPoints.keySet() )
{
System.out.print( "Enter points earned by " + player + " >> " );
Integer points = input.nextInt();
mapPlayerToPoints.put( player , points );
}
// Output
System.out.println( "\nPoints for Game\n" );
for ( Map.Entry < String, Integer > entry : mapPlayerToPoints.entrySet() )
{
String message = "\n" + entry.getKey() + " " + "⭐".repeat( entry.getValue() ); // WHITE MEDIUM STAR is the star character.
System.out.println( message );
}
}
}
运行时:
Enter points earned by Art >> 22
Enter points earned by Bob >> 1
Enter points earned by Cal >> 11
Enter points earned by Dan >> 2
Enter points earned by Eli >> 33
Points for Game
Art ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Bob ⭐
Cal ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Dan ⭐⭐
Eli ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
public class Main {
public static void main(String... args) {
Map<String, Integer> data = new TreeMap<>();
data.put("John Doe", 22);
data.put("Martin Fowler", 1);
data.put("Calvin Kline", 11);
data.put("Mario Machado", 2);
data.put("Entimissimi", 33);
printHorizontalBarchart(data);
}
public static void printHorizontalBarchart(Map<String, Integer> data) {
String nameFormat = "%" + GET_MAX_NAME_LENGTH.apply(data) + 's';
data.forEach((name, score) -> {
System.out.format(nameFormat, name);
System.out.print(' ');
PRINT_STARS.accept(score);
System.out.println();
});
}
private static final Function<Map<String, Integer>, Integer> GET_MAX_NAME_LENGTH =
data -> data.keySet().stream().mapToInt(String::length).max().orElse(0);
private static final IntConsumer PRINT_STARS = total -> IntStream.range(0, total).forEach(i -> System.out.print('*'));
}
Output:
Calvin Kline ***********
Entimissimi *********************************
John Doe **********************
Mario Machado **
Martin Fowler *
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.