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

开发一个程序显示一个直方图,它显示文本区域中每个字母出现的次数。每个字母用一种颜色标识。如下图所示:
初始界面:
这里写图片描述
输入字符:
这里写图片描述

显示结果:
这里写图片描述

代码实现:
一,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);
    }
}
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值