[英]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.