繁体   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