Java语言程序设计基础篇_编程练习题**16.11(创建表示字母出现次数的直方图)

目录

题目:**16.11(创建表示字母出现次数的直方图)

习题思路

1.HistogramPane类

2. HistogramPaneDemo类

 代码示例

结果展示 


题目:**16.11(创建表示字母出现次数的直方图)

  编写一个程序,从文件中读取内容并显示一个直方图,表示文件中每个字母出现的次数,如图16-40所示。从文本域中输入文件名。在文本域上按回车键从而程序开始读取并处理文件,并且显示直方图。直方图在窗体中央显示。定义一个继承自Pane的名为Histogram的类。该类包含counts属性,该属性是一个包含26个元素的数组。Counts[0]存储A的出现次数,counts[1]存储B的出现次数,依此类推。类还包含一个设置方法,用于设置一个新的counts并且为新的counts显示直方图。

  • 习题思路
  • 1.HistogramPane类
  1. 类按照题目要求继承Pane,创建属性counts[],添加get和set方法(get方法可有可无,在set方法中调用绘图方法)
  2. 创建两个构造函数,无参的构造函数使用new实例化属性counts,另一个构造函数传入一个int[]数组,赋值给属性counts
  3. 创建一个绘制直方图的方法,绘制一条固定的线表示直方图的底部,循环26次用Rectangle绘制直方图,同时添加图标
  4. (绘图方法详解)用Rectangle绘制图形时可以用counts中的最大数除以高作为每个字母个数+1的间距,矩形的高即为字母数量乘以这个值
  5. 矩形的x坐标从一个特定的值开始,每循环一次就增加一个值,y坐标为直方图的底部y坐标减去矩形的高
  6. 在循环内用Text添加图例,x稍大于矩形的x坐标,y稍大于直方图底部的y坐标,用ASCII码表示图例内容,从65开始一直+1,直到循环结束

 

  • 2. HistogramPaneDemo类
  1. 创建一个int[] counts数组,并实例化 HistogramPane类,但不传入参数
  2. 创建一个HBox布局,添加Label、TextField、Button
  3. 创建BorderPane,把HistogramPane设置在中心,把HBox设置在底部
  4. 为按钮Button注册一个鼠标点击事件,事件被触发时检查TextField是否为空,不为空则以输入框内容为路径,用Scanner读取,while循环读取行,循环检查每一个字符,如果是字符,则把counts数组中的对应位置+1。while循环结束后调用HistogramPane的setCounts()方法
  •  代码示例

编程练习题16_11HistogramPane.java 

package chapter_16;import javafx.scene.chart.BarChart;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;public class 编程练习题16_11HistogramPane extends Pane{private int[] counts ;编程练习题16_11HistogramPane() {counts = new int[26];drawHistogram();}编程练习题16_11HistogramPane(int[] counts) {this.counts = counts;drawHistogram();}public int[] getCounts() {return counts;}public void setCounts(int[] counts) {this.counts = counts;getChildren().clear();drawHistogram();}public void drawHistogram() {int maxCount = 0;Line l = new Line(20, 200, 400, 200);for(int c:counts) {if(c > maxCount) {maxCount = c;}}int intervalV = 0;if(maxCount == 0) {intervalV = 0;}else  intervalV = 200 / maxCount;int intervalH = 10;int x = 20; int n = 65;for(int i = 0;i < 26;i++) {int height = counts[i]*intervalV;//if(counts[i] == 0) height = 1;Rectangle r = new Rectangle(x,200-height,12,height);r.setFill(Color.TRANSPARENT);r.setStroke(Color.BLACK);Text num = new Text(x+2,212,(char)n+"");getChildren().addAll(r,num);x += intervalH+5;n++;}getChildren().addAll(l);}
}

 编程练习题16_11HistogramPaneDemo.java

package chapter_16;import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;public class 编程练习题16_11HistogramPaneDemo extends Application{@Overridepublic void start(Stage primaryStage) throws Exception {int[] counts = new int[26];编程练习题16_11HistogramPane histogramPane = new 编程练习题16_11HistogramPane();HBox hBox = new HBox(10);hBox.setAlignment(Pos.CENTER);hBox.setStyle("-fx-border-color:black");TextField tfPath = new TextField();Label label = new Label("FilePath",tfPath);label.setContentDisplay(ContentDisplay.RIGHT);Button btView = new Button("View");hBox.getChildren().addAll(label, tfPath, btView);BorderPane borderPane = new BorderPane();borderPane.setCenter(histogramPane);borderPane.setBottom(hBox);btView.setOnMouseClicked(e ->{if(!tfPath.getText().isEmpty()) {try {String path = tfPath.getText();File file = new File(path);Scanner input = new Scanner(file);while(input.hasNextLine()) {String line = input.nextLine();for(char c:line.toCharArray()) {if(Character.isLetter(c)) {char c2 = Character.toUpperCase(c);if(c2 >='A'&&c2 <= 'Z') {counts[c2 - 'A']++;}}}}histogramPane.setCounts(counts);input.close();} catch (FileNotFoundException e1) {e1.printStackTrace();}}});Scene scene = new Scene(borderPane,420, 245);primaryStage.setTitle("编程练习题16_11HistogramPaneDemo");primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {Application.launch(args);}
}
  • 结果展示 

初始状态 

 

显示结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394340.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CAD启动时自动加载vba程序方法

启动AutoCAD时自动启动你的dvb文件&#xff0c;方法如下&#xff1a; 方法一、加载 VBA 时&#xff0c;它会在 AutoCAD安装 目录中&#xff0c;查找名为 acad.dvb 的工程删除&#xff0c;将你的dvb文件命名为acad.dvb,替换掉原始文件即可。方法二、启动 AutoCAD 时&#xff0c…

Python 异步编程:Sqlalchemy 异步实现方式

SQLAlchemy 是 Python 中最流行的数据库工具之一&#xff0c;在新版本中引入了对异步操作的支持。这为使用异步框架&#xff08;如 FastAPI&#xff09;开发应用程序带来了极大的便利。在这篇文章中&#xff0c;简单介绍下 SQLAlchemy 是如何利用 Greenlet 实现异步操作的。 什…

proteus仿真c51单片机(四)双机串口通信(电路设计及代码)

实验要求 1.通过甲机的按键给乙机发送控制字符&#xff0c;同时也可以实现乙机给甲机发送控制字符 2&#xff0e;用PROTEUS软件根据所给电路画出电路图&#xff0c;用KEIL软件调试程序和编译&#xff0c;最后在PROTEUS软件中实现仿真。 3.甲乙两个单片机通过串口进行通信&am…

第R2周:Pytorch实现:LSTM-火灾温度预测

nn.LSTM() 函数详解 nn.LSTM 是 PyTorch 中用于创建长短期记忆&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;模型的类。LSTM 是一种循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;的变体&#xff0c;用于处理序列数据&#…

工业设计用什么CAD软件?SolidWorks 成为您创意实现的得力助手

随着科技的发展&#xff0c;工业设计已经进入了数字化时代。对于设计师来说&#xff0c;选择一款高效、功能全面的设计软件至关重要。在市场上众多的CAD&#xff08;计算机辅助设计&#xff09;软件中&#xff0c;SolidWorks因其出色的性能和广泛的适用性而备受青睐。本文将介绍…

5.1 Python 函数的定义

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

【网络】协议与网络版计算器

协议与网络版计算器 文章目录 1.协议的概念1.1序列化与反序列化 2.网络版计算器2.1封装套接字2.2协议定制2.2.1Jsoncpp2.2.2报文处理 2.3会话层&#xff1a;TcpServer2.4应用层&#xff1a;Calculate2.5表示层&#xff1a;Service2.6应用层、表示层和会话层->应用层 1.协议…

PHP企业培训考试系统小程序源码

&#x1f680;企业培训考试系统&#xff0c;赋能员工成长新引擎&#x1f4da; &#x1f331; 开篇&#xff1a;解锁企业培训新篇章 在快速变化的商业环境中&#xff0c;员工的能力提升是企业持续发展的关键。&#x1f680; 传统的培训方式已难以满足现代企业的需求&#xff0…

获取客户端真实IP

出于安全考虑&#xff0c;近期在处理一个记录用户真实IP的需求。本来以为很简单&#xff0c;后来发现没有本来以为的简单。这里主要备忘下&#xff0c;如果服务器处于端口回流&#xff08;hairpin NAT&#xff09;,keepalived&#xff0c;nginx之后&#xff0c;如何取得客户端的…

【5G NAS】全球唯一临时标识符GUTI介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

通过python搭建文件传输服务器;支持多台电脑之间互相传输文件(支持局域网或广域网)(应该也能用于虚拟机和宿主机之间)

因为公司网络防火墙限制,所以在公司的电脑之间传输文件还是非常不方便的;所以自己搭建了一个文件传输服务器,用于多台电脑间的文件传输; 先放上最终效果: 文章目录 一、运行环境要求二、环境搭建2.1 安装python2.2 搭建虚拟环境方法1:创建Anaconda虚拟环境方法2:创建pyt…

行业大模型——详细介绍

行业垂类模型 行业垂类模型是指针对特定行业或领域而设计的人工智能模型&#xff0c;它们通过大量行业数据的训练&#xff0c;具备较高的专业性和针对性&#xff0c;能够更好地解决行业内的特定问题。以下是一个详细的构建行业垂类模型的步骤&#xff1a; 行业垂类模型的需求分…

【STM32】USART串口和I2C通信

个人主页~ USART串口和I2C通信 USART串口一、串口1、简介2、电路要求3、参数及时序 二、USART外设1、USART结构2、波特率发生器 三、数据包1、HEX数据包HEX数据包接收 2、文本数据包文本数据包接收 I2C通信一、简介二、通信协议1、硬件电路2、I2C时序基本单元 三、I2C外设1、简…

ST-LINK烧录MCU

打开ST-LINK软件&#xff1a; 主板断电状态下接入烧录器&#xff0c;烧录器USB连接电脑&#xff1a; 主板上电&#xff0c;点击连接按钮&#xff1a; 点击加载文件&#xff1a; 点击写入按钮&#xff0c;烧录成功后拔掉烧录器&#xff0c;主板重新上电

k8s使用kustomize来部署应用

k8s使用kustomize来部署应用 本文主要是讲述kustomzie的基本用法。首先&#xff0c;我们说一下部署文件的目录结构。 ./ ├── base │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml └── overlays└── dev├── kustomization.…

C基础练习(学生管理系统)

1.系统运行&#xff0c;打开如下界面。列出系统帮助菜单&#xff08;即命令菜单&#xff09;&#xff0c;提示输入命令 2.开始时还没有录入成绩&#xff0c;所以输入命令 L 也无法列出成绩。应提示“成绩表为空&#xff01;请先使用命令 T 录入学生成绩。” 同理&#xff0c;当…

设计模式- 数据源架构模式

数据映射器&#xff08;Data mapper&#xff09; 在保持对象和数据库彼此独立的情况下&#xff0c;在二者之间移动数据的一个映射器层 数据映射器是分离内存对象域数据库的一个软件层。其职责是在内存对象与数据库之间传递数据并保持它们彼此独立。 运行机制 分离领域和数据源…

HVV小科普:蓝方是什么?

正文共&#xff1a;12345 字 19 图&#xff0c;预估阅读时间&#xff1a;9 分钟 网络实战攻防演习&#xff0c;俗称“护网”、“HW”等&#xff0c;是指模拟真实网络环境中的攻击和防御行为&#xff0c;旨在提高网络安全防护能力和应急响应能力。这种演习通常由安全团队、军事组…

ASP.NET Core 基础 - 入门实例

一. 下载 1. 下载vs2022 Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 学生,个人开发者选择社区版就行,免费的. 安装程序一直下一步下一步就行,别忘了选择安装位置,如果都放在C盘的话,就太大了. 2. 选择工作负荷 准备工作完成 二. 创建新项目 三…

数据结构复杂度

文章目录 一. 数据结构前言1.1 数据结构1.2 算法 二. 算法效率2.1 时间复杂度2.1.1 T(N)函数式2.1.2 大O的渐进表示法 一. 数据结构前言 1.1 数据结构 什么是数据结构呢&#xff1f;打开一个人的主页&#xff0c;有很多视频&#xff0c;这是数据&#xff08;杂乱无章&#xf…