您的位置:首页 > 编程语言 > Java开发

字符出现次数统计直方图-Java实现

2016-11-06 20:51 741 查看
开发一个程序显示一个直方图,它显示文本区域中每个字母出现的次数。每个字母用一种颜色标识。如下图所示:

初始界面:



输入字符:



显示结果:



代码实现:

一,HistogramBarChart类用于实现绘制直方图

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class HistogramBarChart extends JPanel{

private double[] dataValue={200,140,100,60,40};
private String[] dataName = {"CS", "Math", "Chem", "Biol", "Phys"};
private Color[] colors = {Color.red, Color.yellow, Color.green,
Color.blue, Color.cyan, Color.magenta, Color.orange, Color.pink,
Color.darkGray};
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(dataValue==null)return;
double max=dataValue[0];
for(int i=1;i<dataValue.length;++i)
max=Math.max(max, dataValue[i]);
int barWidth = (int)((getWidth() - 20.0)/dataValue.length - 10);
int maxBarHeight = getHeight() - 30;
g.drawLine(5, getHeight()-10, getWidth()-5, getHeight()-10);
int x=15;
for(int i=0;i<dataValue.length;++i)
{
g.setColor(colors[i%colors.length]);
int newHeight=(int)(maxBarHeight*dataValue[i]/max);
int y=getHeight()-10-newHeight;
g.fillRect(x, y, barWidth, newHeight);
g.setColor(Color.black);
if((dataName!=null)&&(i<dataName.length))
g.drawString(dataName[i], x, y-7);
x+=barWidth+10;
}
}
public void setData(String[] dataName,double[] dataValue)
{
this.dataName=dataName;
this.dataValue=dataValue;
repaint();
}

public HistogramBarChart() {

}

}


二,HistogramTask类,实现程序的动作监听部分

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class HistogramTask extends JPanel{

private JTextArea jta;
private JButton jbtShow=new JButton("Show Histogram");
private HistogramBarChart histogram=new HistogramBarChart();

private JFrame histogramPanel=new JFrame();

public HistogramTask() {
JScrollPane scrollPane=new JScrollPane(jta=new JTextArea());
scrollPane.setPreferredSize(new Dimension(300, 200));
jta.setWrapStyleWord(true);
jta.setLineWrap(true);

setLayout(new BorderLayout());
add(scrollPane,BorderLayout.CENTER);
add(jbtShow, BorderLayout.SOUTH);
jbtShow.addActionListener(new Listener());

}

class Listener implements ActionListener{
public void actionPerformed(ActionEvent e) {
int count[]=countLetters();
double[] data=new double[26];
for(int i=0;i<26;++i)
data[i]=count[i];
String[] letters=new String[26];
for(int i=0;i<26;++i)
letters[i]=""+(char)('A'+i);
histogram.setData(letters, data);
histogram.repaint();

histogramPanel.add(histogram);
histogramPanel.pack();
histogramPanel.setSize(400, 200);
histogramPanel.setLocationRelativeTo(null);
histogramPanel.setTitle("Bar Chart");
histogramPanel.setVisible(true);
histogramPanel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

private int[] countLetters()
{
int[] count=new int[55];
String text=jta.getText().trim();
for(int i=0;i<text.length();++i)
{
char character=text.charAt(i);
if((character>='A')&&(character<='Z'))
count[(int)character-65]++;
else if((character>='a')&&(character<='z'))
count[(int)character-95]++;
}
return count;
}

}
}


三,Frame

import javax.swing.JFrame;

public class MainFrame extends JFrame
private HistogramTask panel=new HistogramTask();
public MainFrame() {
add(panel);
}
public static void main(String[] args) {
MainFrame frame=new MainFrame();
frame.setSize(400, 200);
frame.setTitle("直方图");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐