簡體   English   中英

使用 java 的條形圖

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM