【问题标题】:Java GPA calculation (how to set unlimited arrays?)Java GPA计算(如何设置无限数组?)
【发布时间】:2012-01-27 12:00:52
【问题描述】:

基本上,我的问题是我不确定如何设置来自用户的无限输入数组。 目前,仅当用户准确输入 6 个主题时,计算才能顺利进行,但如果输入的主题少于或超过 6 个,则计算不会成功。 不知何故,我想让输入不受限制..

这是我目前所拥有的:

主类

import javax.swing.*;

public class CGPAMain extends JFrame
{
  public static void main(String[] args)
  {
    JFrame frame = new JFrame("GPA Calculation");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    MainPage panel = new MainPage();
    frame.getContentPane().add(panel);

    frame.pack();
    frame.setVisible(true);
  }
}

其他类

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class MainPage extends JPanel
    {
        //declare GUI elements
        private JLabel subjectLabel, cHoursLabel, gradeLabel;       
        private JTextField subject, cHours;
        private JButton addSubjectButton, calcGPAButton, clearAllButton;
        private JTextArea tArea;
        private JComboBox grade;

        //declare array to store and collect user input value
        String[] subjectArray = new String[6];                  
        String[] gradeArray = new String[6];
        int[] cHoursArray = new int[6];
        double[] gradeValue = { 4.00, 3.67, 3.33, 3.00, 2.67, 2.33, 2.00, 1.67, 1.33, 1.00, 0.00 };
        String[] gradeLetter= { "A",  "A-", "B+", "B",  "B-", "C+", "C",  "D",  "D-", "E",  "F"};                  


        public MainPage()
        {   
            setLayout (null);
            setPreferredSize (new Dimension(500, 500));
            setBackground (Color.orange); 

            //Properties of GUI elements
            subjectLabel = new JLabel ("Subject Name: ");                       
            subject = new JTextField (33);
            subject.addActionListener (new TempListener());

            gradeLabel = new JLabel ("Grade: ");
            grade = new JComboBox (gradeLetter); 
            grade.addActionListener (new TempListener());

            cHoursLabel = new JLabel ("Credit Hours: ");
            cHours = new JTextField (1);
            cHours.addActionListener (new TempListener());

            addSubjectButton = new JButton("Add Another Subject");
            addSubjectButton.addActionListener(new TempListener());
            calcGPAButton = new JButton("Calculate GPA");
            calcGPAButton.addActionListener(new TempListener());
            clearAllButton = new JButton("Clear All");
            clearAllButton.addActionListener(new TempListener());

            tArea = new JTextArea(5, 5);                
            tArea.setEditable(false);     

            add (subjectLabel);
            add (subject);
            add (gradeLabel);
            add (grade);
            add (cHoursLabel);
            add (cHours);
            add (addSubjectButton);
            add (calcGPAButton);
            add (clearAllButton);
            add (tArea);

            //Position of GUI elements
            subjectLabel.setBounds      (20, 20, 150, 20);              
            subject.setBounds           (120, 20, 350, 20);
            gradeLabel.setBounds        (20, 50, 50, 20);
            grade.setBounds             (120, 50, 50, 20);
            cHoursLabel.setBounds       (20, 80, 100, 20);
            cHours.setBounds            (120, 80, 50, 20);
            addSubjectButton.setBounds  (20, 120, 200, 30);
            calcGPAButton.setBounds     (300, 440, 175, 30);
            clearAllButton.setBounds    (20, 440, 120, 30);
            tArea.setBounds             (20, 170, 450, 250); 
        }


        private class TempListener implements ActionListener
        {
          //---------------------------------------------------------------------------
          //  Performs the conversion when the enter key is pressed in the text field.
          //---------------------------------------------------------------------------
            double tCrPoints = 0.00, tCrHours = 0.00, tGPA = 0.00;  
            String status; 

            public void actionPerformed(ActionEvent event)
            {
                if (event.getSource() == addSubjectButton)                   
                {
                    for (int i=0; i<6; i++)
                    {
                        subjectArray[i] = subject.getText();
                        gradeArray[i] = (String) grade.getSelectedItem();
                        cHoursArray[i] = Integer.parseInt(cHours.getText()); 
                    }

                    tArea.append (subject.getText() + "\t\t\t" + 
                                  grade.getSelectedItem() + "\t"  + 
                                  cHours.getText() + "\n"); 
                    subject.setText("");
                    cHours.setText(""); 
                }


                if (event.getSource() == calcGPAButton)   
                {
                    for (int i=0 ; i<gradeArray.length; i++)
                    {
                        for (int j=0; j<gradeLetter.length; j++)
                        {
                            if(gradeArray[i].equals(gradeLetter[j]))
                            {
                                tCrHours += cHoursArray[i]; 
                                tCrPoints += gradeValue[j] * cHoursArray[i];
                            }
                        }
                    }

                    tGPA = tCrPoints/tCrHours;

                    if (tGPA >= 2)
                        status = ("Pass");
                    else
                        status = ("Fail"); 

                    //Output for text area 
                    tArea.setText("Total Credit Points : " + tCrPoints + "\n" +
                                  "Total Credit Hours : " + tCrHours + "\n\n" + 
                                  "Grade Point Average (GPA) : " + tGPA + "\n" +
                                  "Status : " + status); 
                } 


                if (event.getSource() == clearAllButton)  
                {
                    tArea.setText("");
                    cHours.setText("");
                    grade.setSelectedIndex(0);
                    tCrHours = 0.00;
                    tCrPoints = 0.00;
                }


           }





        }
    }

【问题讨论】:

    标签: java arrays swing


    【解决方案1】:

    使用哈希图来包含您的所有成绩,并使用数组列表来包含您的小时数和获得的成绩。这是您所拥有的内容的快速重写。

    public class MainPage extends JPanel {
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    private JLabel subjectLabel, cHoursLabel, gradeLabel;      
    private JTextField subject, cHours;
    private JButton addSubjectButton, calcGPAButton, clearAllButton;
    private JTextArea tArea;
    private JComboBox grade;
    
    List<String> gradeArray = new ArrayList<String>();
    List<Integer> cHoursArray = new ArrayList<Integer>();
    Map<String, Double> grades = new HashMap<String, Double>();
    
    public MainPage() {
        this.populateGrades();
    
        setLayout(null);
        setPreferredSize (new Dimension(500, 500));
        setBackground (Color.orange);
    
        subjectLabel = new JLabel ("Subject Name: ");
        subject = new JTextField (33);
        subject.addActionListener (new TempListener());
    
        gradeLabel = new JLabel ("Grade: ");
        grade = new JComboBox (grades.keySet().toArray()); 
        grade.addActionListener (new TempListener());
    
        // ... THE REST OF YOU CODE ... //
    }
    
    private void populateGrades() {
        grades.put("A", 4.00);
        grades.put("A-", 3.67);
        grades.put("B+", 3.67);
        grades.put("B", 3.67);
        grades.put("B-", 3.67);
        grades.put("C+", 3.67);
        grades.put("C", 3.67);
        grades.put("D", 3.67);
        grades.put("D-", 3.67);
        grades.put("E", 3.67);
        grades.put("F", 3.67);
    }
    
    private class TempListener implements ActionListener {
        double tCrPoints = 0.00, tCrHours = 0.00, tGPA = 0.00;
        String status;
    
        public void actionPerformed(ActionEvent event) {
            if (event.getSource() == addSubjectButton) {
                // Not sure what you are trying to do here, you are basically setting the 3 arrays identical
                // subject.getText() = 1 ==> subjectArray[1,1,1,1,1,1]
                // Do not see the point of this at all
                /* for (int i=0; i<6; i++) {
                    subjectArray[i] = subject.getText();
                    gradeArray[i] = (String) grade.getSelectedItem();
                    cHoursArray[i] = Integer.parseInt(cHours.getText());
                } */
    
                gradeArray.add(grade.getSelectedItem().toString());
                cHoursArray.add(Integer.parseInt(cHours.getText()));
    
                tArea.append (subject.getText() + "\t\t\t" + grade.getSelectedItem() + "\t"  + cHours.getText() + "\n");
                subject.setText("");
                cHours.setText("");
            }
    
            if (event.getSource() == calcGPAButton) {
                for (String grade : gradeArray) {
                    tCrPoints += grades.get(grade);
                }
    
                for (Integer hour : cHoursArray) {
                    tCrHours += hour;
                }
    
                tGPA = tCrPoints/tCrHours;
    
                if (tGPA >= 2) {
                    status = ("Pass");
                } else {
                    status = ("Fail");
                }
    
                tArea.setText("Total Credit Points : " + tCrPoints + "\n" +
                            "Total Credit Hours : " + tCrHours + "\n\n" +
                            "Grade Point Average (GPA) : " + tGPA + "\n" +
                            "Status : " + status);
            }
    
            if (event.getSource() == clearAllButton) {
                tArea.setText("");
                cHours.setText("");
                grade.setSelectedIndex(0);
                tCrHours = 0.00;
                tCrPoints = 0.00;
            }
        }
    }
    }
    

    【讨论】:

      【解决方案2】:

      您应该查看ArrayListVector 甚至LinkedList 以获得您所寻求的功能。这是tutorial 解释如何使用ArrayList

      这个想法很简单:ArrayList 将负责增长一个内部数组来存储其元素,并且当您不断向其中添加元素时,它会自动增长以适应它们。严格来说,大小不会无限,但对于大多数实际情况来说,最多 2^31-1 个位置(假设你有足够的内存)应该已经足够了。

      编辑:

      对于您的特定示例:

      // create an ArrayList
      ArrayList<Double> gradeValue = new ArrayList<Double>();
      
      // add elements to the ArrayList
      gradeValue.add(4.00);
      gradeValue.add(3.67); // etc.
      
      // iterating over the ArrayList
      for (int i = 0; i < gradeValue.size(); i++) {
          double value = gradeValue.get(i);
          // etc.
      }
      

      【讨论】:

      • @AisyahNadiah 我添加了一些示例代码,我会让你弄清楚细节(看看教程!)
      • hm..但是如何接收用户对 subjectArray、gradeArray 和 cHoursArray 的输入.. 应该是我不必将元素设置为 ArrayList
      • 使用ArrayList而不是数组,你要学会使用Collections
      【解决方案3】:

      您将main() 与 GUI 和应用程序的其余部分分开做得很好,但我认为您也应该进一步将 GUI 与计算代码分开。

      考虑一个更大的问题:为什么 GUI JPanel 知道成绩和 GPA? JPanel 的工作是知道如何在框内呈现 GUI 元素并将输入事件路由到正确的小部件对象。

      我相信,如果您将代码从代码中拆分为管理等级以处理 GUI,您的代码将更易于维护,并且肯定更具延展性。在告诉 GUI 将值更新到 model 与让模型从 GUI 轮询数据值之间总是会有一些困难,但您可以定义最适合您需求的接口:它可能是一个GPA 对象,它使用SLaks's recommended ArrayList&lt;E&gt; 存储各个Subject 对象,这些对象知道课程的名称、年级、日期等。(它可能只是(namegrade)元组,因为这到目前为止是短而甜蜜的。)

      您的GPA 对象可以导出一个接口:public void addSubject(String className, String grade)public double getGPA()。您的 GUI 可以调用此接口来添加新类并检索 GPA 以进行显示。

      我意识到这是一个比你想要的更激烈的重写。它甚至不会立即解决您的问题。但我相信,单独查看 GPA 代码时,它看起来比现在隐藏在 GUI 代码中更容易操作。

      【讨论】:

      • 如果您在截止日期之前并且没有时间按照我的建议重新编写您的代码 - 或者不想 - 您需要重新 -使用ArrayList&lt;E&gt; 集合或Óscar 建议的其他机制编写代码。
      【解决方案4】:

      您正在寻找ArrayList&lt;E&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多