Java三角直方图
我需要一个项目的帮助,我想创建一个java程序,创建一种三角形形状的直方图,很难解释,所以请看下面的示例Java三角直方图,java,histogram,Java,Histogram,我需要一个项目的帮助,我想创建一个java程序,创建一种三角形形状的直方图,很难解释,所以请看下面的示例 input : 3 1 12 0 7 output: _ /|\ / | \ / | \ / | \
input : 3 1 12 0 7
output:
_
/|\
/ | \
/ | \
/ | \
/ | \ _
/ | \ /|\
/ | \ / | \
/ | \ / | \
_ / | \ / | \
/|\ / | \ / | \
/ | \ _ / | \ / | \
/ | \ /|\ / | \ _ / | \
<=======><===><=========================><=><===============>
| | | | | | | | |
输入:311207
输出:
_
/|\
/ | \
/ | \
/ | \
/ | \ _
/ | \ /|\
/ | \ / | \
/ | \ / | \
_ / | \ / | \
/|\ / | \ / | \
/ | \ _ / | \ / | \
/ | \ /|\ / | \ _ / | \
| | | | | | | | |
在我的代码中,我成功地创建了输入部分和基础生成器,但是三角形/吡拉米兹生成器没有生成正确的空格,有人能帮我吗?
下面是我制作三角形的代码(假设输入是数组numbers和numbers2中的内容):
公共级尖顶{
公共静态void main(字符串[]args){
int[]数={3,1,12,0,7};
int计数器=6,最大值=12;
int[]numbers2={3,1,12,0,7};
对于(int row=max+1;row>=0;--row){
System.out.println();
用于(整数列=0;列<计数器-1;++列){
if(编号2[col]>=行){
对于(int-spacesleft=1;spacesleft<(数字2[col]+col)+row-1;++spacesleft){
系统输出打印(“”);
}
如果(第2列[列]!=行){
系统输出打印(“/”);
对于(int c3=0;c3 对于(inti=0;i您就快到了!只需要进行一些调整
三角形支腿左右两侧外部空间数量的计算实际上非常简单:行+1
。因为每个三角形都是自下而上构建的,所以第0行(底行)上显示的三角形需要1个空间,第1行需要2个空间,以此类推
如果当前的行
位于正在显示的三角形列的“上方”,则仍然需要输出空格来标记该三角形的占位符。因此If(numbers2[col]>=行)
需要相应的else
来显示空格
应用这两个更改会得到如下结果:
if(numbers2[col] >= row){
// corrected calculation \-------/
for(int spacesleft = 0; spacesleft < row + 1; ++spacesleft){
System.out.print(" ");
}
if(numbers2[col] != row){
System.out.print("/");
for(int c3 = 0; c3 < numbers2[col] - row - 1; ++c3) {
System.out.print(" ");
}
System.out.print("|");
for(int c3 = 0; c3 < numbers2[col] - row - 1; ++c3) {
System.out.print(" ");
}
System.out.print("\\");
}else{
System.out.print("_");
}
// corrected calculation \-------/
for(int spacesright = 0; spacesright < row + 1; ++spacesright){
System.out.print(" ");
}
// output spaces to fill area for that column and shift everything over properly
} else {
for (int spaces = 0; spaces < numbers2[col] * 2 + 3; spaces++)
System.out.print(" ");
}
介绍
我给出这个答案的原因是写一篇关于如何通过编码问题进行推理的文章。三角形柱状图非常有趣,足以让我找到解决方案
下面是一个测试运行:
Enter the heights of the triangles: 3 1 12 0 7
-
/|\
/ | \
/ | \
/ | \
/ | \ -
/ | \ /|\
/ | \ / | \
/ | \ / | \
- / | \ / | \
/|\ / | \ / | \
/ | \ - / | \ / | \
/ | \ /|\ / | \ - / | \
<=======><===><=========================><=><===============>
| | | | | | | | |
Enter the heights of the triangles:
输入三角形的高度:3 1 12 0 7
-
/|\
/ | \
/ | \
/ | \
/ | \ -
/ | \ /|\
/ | \ / | \
/ | \ / | \
- / | \ / | \
/|\ / | \ / | \
/ | \ - / | \ / | \
/ | \ /|\ / | \ - / | \
| | | | | | | | |
输入三角形的高度:
推理
输入三角形的高度,输出柱状图三角形。按Enter键而不键入任何数字可让程序知道退出
当我看直方图时,我注意到三件事
我可以创建一个Java类来形成三角形,并为我需要绘制的每个三角形创建一个类实例
如果我首先创建基准行,我可以使用<和>符号的定位来计算三角形边的起始位置
自下而上创建直方图比自上而下创建直方图容易得多
现在,我知道我可以使用String Bu建器创建一个空字符串并使用StCARAT方法在空白字符串中放置字符,这有很大帮助。这样,我不必计算在三角形中间和中间的空格数。
我知道我可以使用一个列表来存储输出字符串,并以创建字符串的相反顺序打印它们,这也有很大帮助
所以,这里是我能给你的第一个解决编码问题的提示
如果有些事情看起来很难完成,问问别人是否有更简单的方法
可能没有更简单的方法。有些编码问题很难解决。但有时,您可能不知道更简单的解决方案
这是密码
if(numbers2[col] >= row){
// corrected calculation \-------/
for(int spacesleft = 0; spacesleft < row + 1; ++spacesleft){
System.out.print(" ");
}
if(numbers2[col] != row){
System.out.print("/");
for(int c3 = 0; c3 < numbers2[col] - row - 1; ++c3) {
System.out.print(" ");
}
System.out.print("|");
for(int c3 = 0; c3 < numbers2[col] - row - 1; ++c3) {
System.out.print(" ");
}
System.out.print("\\");
}else{
System.out.print("_");
}
// corrected calculation \-------/
for(int spacesright = 0; spacesright < row + 1; ++spacesright){
System.out.print(" ");
}
// output spaces to fill area for that column and shift everything over properly
} else {
for (int spaces = 0; spaces < numbers2[col] * 2 + 3; spaces++)
System.out.print(" ");
}
// output 'count' spaces
public static void printSpaces(int count) {
for (int spaces = 0; spaces < count; spaces++) System.out.print(" ");
}
// output one row of a triangle based on supplied height
// and current display row, starting at 0=top row.
public static void printTriangleSection(int triangleHeight, int rowOfTriangle) {
int triangleWidth = triangleHeight * 2 + 3; // total width taken up by this triangle
int halfWidth = triangleHeight + 1; // total width taken up by one side (excluding the middle)
int spacesOutside = halfWidth - rowOfTriangle; // total spaces outside of triangle hypotenuse
int spacesInside = rowOfTriangle - 1; // total spaces inside triangle hypotenuse
if (rowOfTriangle < 0) { // above the first row of the triangle
printSpaces(triangleWidth);
} else if (rowOfTriangle == 0) {
printSpaces(spacesOutside);
System.out.print("_");
printSpaces(spacesOutside);
} else {
printSpaces(spacesOutside);
System.out.print("/");
printSpaces(spacesInside);
System.out.print("|");
printSpaces(spacesInside);
System.out.print("\\");
printSpaces(spacesOutside);
}
}
for(int row = max+1; row >= 0; --row) {
System.out.println();
for(int col = 0; col < counter-1; ++col) {
printTriangleSection(numbers2[col], numbers2[col] - row);
}
}
Enter the heights of the triangles: 3 1 12 0 7
-
/|\
/ | \
/ | \
/ | \
/ | \ -
/ | \ /|\
/ | \ / | \
/ | \ / | \
- / | \ / | \
/|\ / | \ / | \
/ | \ - / | \ / | \
/ | \ /|\ / | \ - / | \
<=======><===><=========================><=><===============>
| | | | | | | | |
Enter the heights of the triangles:
package com.ggl.testing;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class TriangleHistogram implements Runnable {
public static void main(String[] args) {
new TriangleHistogram().run();
}
@Override
public void run() {
Scanner scanner = new Scanner(System.in);
List<TriangleModel> triangleHistogram = readInput(scanner);
while (triangleHistogram.size() > 0) {
String baseString = createBaseString(triangleHistogram);
String bottomString = createBottomString(triangleHistogram,
baseString.length());
List<String> histogramStrings = new ArrayList<>();
histogramStrings.add(bottomString);
histogramStrings.add(baseString);
createTriangleStrings(triangleHistogram, histogramStrings);
displayHistogram(histogramStrings);
triangleHistogram = readInput(scanner);
}
scanner.close();
}
private List<TriangleModel> readInput(Scanner scanner) {
List<TriangleModel> triangleHistogram = new ArrayList<>();
System.out.print("Enter the heights of the triangles: ");
String inputLine = scanner.nextLine();
if (!inputLine.trim().isEmpty()) {
String[] triangleSizes = inputLine.split("\\s");
for (int i = 0; i < triangleSizes.length; i++) {
TriangleModel triangleModel = new TriangleModel(
Integer.parseInt(triangleSizes[i]));
triangleHistogram.add(triangleModel);
}
}
return triangleHistogram;
}
private String createBaseString(List<TriangleModel> triangleHistogram) {
StringBuilder builder = new StringBuilder();
for (TriangleModel triangleModel : triangleHistogram) {
triangleModel.setColumns(builder);
triangleModel.createBase(builder);
}
return builder.toString();
}
private String createBottomString(List<TriangleModel> triangleHistogram,
int length) {
StringBuilder builder = createStringBuilder(' ', length);
for (TriangleModel triangleModel : triangleHistogram) {
triangleModel.createBottom(builder);
}
return builder.toString();
}
private void createTriangleStrings(List<TriangleModel> triangleHistogram,
List<String> histogramStrings) {
String histogramString = "";
do {
String baseString = histogramStrings.get(1);
StringBuilder builder = createStringBuilder(' ',
baseString.length());
for (TriangleModel triangleModel : triangleHistogram) {
triangleModel.createTriangle(builder);
}
histogramString = builder.toString();
histogramStrings.add(histogramString);
} while (!histogramString.trim().isEmpty());
}
private StringBuilder createStringBuilder(char c, int length) {
StringBuilder builder = new StringBuilder(length);
for (int i = 0; i < length; i++) {
builder.append(c);
}
return builder;
}
private void displayHistogram(List<String> histogramStrings) {
for (int i = histogramStrings.size() - 1; i >= 0; i--) {
String line = histogramStrings.get(i);
System.out.println(line);
}
System.out.println();
}
public class TriangleModel {
private final int height;
private int leftColumn;
private int centerColumn;
private int rightColumn;
public TriangleModel(int height) {
this.height = height;
}
public void setColumns(StringBuilder builder) {
this.leftColumn = builder.length() + 1;
this.centerColumn = leftColumn + height;
this.rightColumn = centerColumn + height;
}
public void createBase(StringBuilder builder) {
builder.append('<');
for (int i = 0; i < getBaseWidth(); i++) {
builder.append('=');
}
builder.append('>');
}
public void createBottom(StringBuilder builder) {
builder.setCharAt(leftColumn, '|');
builder.setCharAt(rightColumn, '|');
}
public void createTriangle(StringBuilder builder) {
if (leftColumn < rightColumn) {
builder.setCharAt(leftColumn, '/');
builder.setCharAt(centerColumn, '|');
builder.setCharAt(rightColumn, '\\');
leftColumn++;
rightColumn--;
} else if (leftColumn == rightColumn) {
builder.setCharAt(centerColumn, '-');
leftColumn++;
rightColumn--;
}
}
private int getBaseWidth() {
return height + height + 1;
}
}
}