设计一个布局管理器,显示n个裁判的评分,根据制定规则计算出最后得分。要求:图形界面采用表格(JTable)显示裁判评分;指定分数范围,若超出,则异常处理;得分规则由指定接口约定,由多个接口对象给出多种得分规则,如求平均数值,或去掉一个最高分和一个最低分后,再求平均值。
时间: 2024-05-10 11:17:15 浏览: 111
这是一个Java GUI的问题,我们可以使用Swing和AWT库来实现。我们需要设计一个布局管理器来放置JTable,并且实现一个评分规则的接口,让多个评分规则对象可以实现不同的得分规则。
首先,我们创建一个JFrame窗口,将JTable放在其中。我们使用BoxLayout布局管理器来实现。
``` java
import javax.swing.*;
import java.awt.*;
public class ScoreFrame extends JFrame {
private JTable scoreTable;
public ScoreFrame(Object[][] scores, String[] columnNames) {
super("Score Table");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
scoreTable = new JTable(scores, columnNames);
Container contentPane = getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS));
contentPane.add(scoreTable.getTableHeader());
contentPane.add(scoreTable);
pack();
setVisible(true);
}
public static void main(String[] args) {
Object[][] scores = { { "裁判1", 8.5, 9.0, 7.5, 8.0 }, { "裁判2", 9.0, 9.5, 9.0, 8.5 }, { "裁判3", 9.5, 9.0, 8.5, 9.0 } };
String[] columnNames = { "裁判", "成绩1", "成绩2", "成绩3", "成绩4" };
new ScoreFrame(scores, columnNames);
}
}
```
接下来,我们需要设计一个评分规则的接口,来让多个评分规则对象实现不同的得分规则。这里我们使用了一个名为ScoreStrategy的接口。
``` java
public interface ScoreStrategy {
double calculateScore(double[] scores);
}
```
我们可以通过实现ScoreStrategy接口来实现不同的得分规则。例如,我们实现一个AverageScoreStrategy来求平均分数:
``` java
public class AverageScoreStrategy implements ScoreStrategy {
@Override
public double calculateScore(double[] scores) {
double sum = 0;
for (double score : scores) {
sum += score;
}
return sum / scores.length;
}
}
```
我们还可以实现一个RemoveMinMaxScoreStrategy来去掉一个最高分和一个最低分后求平均分数:
``` java
public class RemoveMinMaxScoreStrategy implements ScoreStrategy {
@Override
public double calculateScore(double[] scores) {
double sum = 0;
double min = Double.MAX_VALUE;
double max = Double.MIN_VALUE;
for (double score : scores) {
sum += score;
if (score < min) {
min = score;
}
if (score > max) {
max = score;
}
}
return (sum - min - max) / (scores.length - 2);
}
}
```
最后,我们需要在ScoreFrame中实现一个方法来计算最后得分。我们可以将评分规则对象作为参数传入该方法,然后根据选定的评分规则来计算得分。
``` java
public double calculateFinalScore(ScoreStrategy scoreStrategy, int rowIndex) throws Exception {
double[] scores = new double[scoreTable.getColumnCount() - 1];
for (int i = 1; i < scoreTable.getColumnCount(); i++) {
Object value = scoreTable.getValueAt(rowIndex, i);
if (!(value instanceof Number)) {
throw new Exception("Invalid score: " + value);
}
double score = ((Number) value).doubleValue();
if (score < 0 || score > 10) {
throw new Exception("Score out of range: " + score);
}
scores[i - 1] = score;
}
return scoreStrategy.calculateScore(scores);
}
```
在该方法中,我们首先读取选中行的评分数据,并检查它们是否在指定的范围内。然后,我们将这些评分数据传递给评分规则对象,让它计算得分。
我们可以在main方法中使用这个方法来计算最后得分:
``` java
public static void main(String[] args) {
Object[][] scores = { { "裁判1", 8.5, 9.0, 7.5, 8.0 }, { "裁判2", 9.0, 9.5, 9.0, 8.5 }, { "裁判3", 9.5, 9.0, 8.5, 9.0 } };
String[] columnNames = { "裁判", "成绩1", "成绩2", "成绩3", "成绩4" };
ScoreFrame scoreFrame = new ScoreFrame(scores, columnNames);
ScoreStrategy scoreStrategy = new RemoveMinMaxScoreStrategy();
try {
double finalScore = scoreFrame.calculateFinalScore(scoreStrategy, 1);
System.out.println("Final score: " + finalScore);
} catch (Exception e) {
e.printStackTrace();
}
}
```
在这个例子中,我们选择了第二行的评分数据,并使用了RemoveMinMaxScoreStrategy来计算最后得分。
阅读全文