我应该使用哪种设计模式来按积分设置比赛场地?
Which a design pattern i should use for set athletic places in competition by points?
我有一个 class AthleticCompetitionResults
并想创建一个 class 方法 return 这个 AthleticCompetitionResults
的对象从行初始化,例如
Siim Susi;12.61;5.00;9.22;1.50;60.39;16.43;21.60;2.60;35.81;5.25.72
Siim Susi2;12.61;5.00;9.22;1.50;60.39;16.43;21.60;2.60;35.81;5.25.72
Jaana Lind;13.75;4.84;10.12;1.50;68.44;19.18;30.85;2.80;33.88;6.22.75
public class AthleticCompetitionResults {
private Athletic athletic;
private float resultM100;
private float resultLongJump;
private float resultShotPut;
private float resultHighJump;
private float resultM400;
private float resultHurdles110m;
private float resultDiscusThrow;
private float resultPoleVault;
private float resultJavelinThrow;
private float resultM1500;
private int points;
public AthleticCompetitionResults(Athletic athletic) {
this.athletic = athletic;
}
public void countPoints(){
//counting
}
// setters and getters
...
已编辑:
我的目标是打印 List<AthleticCompetitionResults>
按积分排序的列表并打印比赛中的位置。如果 points 等于 print 1-2
的地方。示例:
1-2 Siim Susi 4200 pts
1-2 Siim Susi2 4200 pts
3 Jaana Lind 3494 pts
有什么方法可以节省田径比赛的名额? List<Integer>' places in class 'AthleticCompetitionResults
呢?
public class Competition{
private List<AthleticCompetitionResults> athleticsData;
public Competition(List<AthleticCompetitionResults> data){
this.athleticsData = data;
}
public void sortByPoints(){
//sorting by points
}
public void setPlaces(){
//setting athletics places in competition by points
}
public void print(){
//printing e.g 1-2 Siim Susi 4200 pts ...
}
}
最好的方法是将此数据保存在 Map
.
中
密钥将在 class 中写为 final
。
像这样:
private Map<String, String> valuesMap = new HashMap<String, String>();
public static final String ATHLETIC_NAME = "Athletic_Name";
public static final String FIELD_1 = "Field_1";
public static final String FIELD_2 = "Field_2";
public static final String FIELD_3 = "Field_3";
public static final String FIELD_4 = "Field_4";
public static final String FIELD_5 = "Field_5";
private static final String[] FIELDS_LIST = new String[]{
ATHLETIC_NAME,
FIELD_1,
FIELD_2,
FIELD_3,
FIELD_4,
FIELD_5
};
private void getParametersMap(String values){
System.out.println("Loaded Parameters:");
try{
String[] splitted = values.split(";");
if (splitted.length != FIELDS_LIST.length){
throw new Exception("Unmatched arrays size!!");
}
int i=0;
for (String keyItem : FIELDS_LIST){
valuesMap.put(keyItem, splitted[i++]);
}
System.out.println();
}
catch (Exception e){
e.printStackTrace();
}
}
正在考虑:
并不是所有的事件都会在时间里产生结果
- 例如摔跤、射击)
结果取决于事件类型
- 冲刺有完成时间和排名
- 摔跤有winner/looser
某些事件组的结果属性相似
100米短跑、500米短跑、游泳、马拉松都有完赛时间
标枪,铅球,讨论投掷有距离。
所有赛事都有明显的赢家
我们需要一个策略,以便根据事件类型,我们的结果属性可以改变。
让我们试着写下一些示例代码:
class Result {
protected boolean winner;
..
};
class ThrowingResult extends Result{
protected float range;
..
}
class SprintResult extends Result{
protected double timeToFinishInMilliseconds;
protected int finalPosition;
..
}
class AthleticCompetitionResults{
private Athletic athletic;
private SprintResult resultM100;
private SprintResult resultLongJump;
private ThrowingResult javelin;
private ThrowingResult shotPut;
private Result wrestling;
...
}
如果它是您在此 class 中使用的唯一构造函数,那么将其更改为 builder/factory 不会产生任何显着差异。在这种情况下,我会留在构造函数中。用花哨的模式名称覆盖它不会让它变得更好。
我有一个 class AthleticCompetitionResults
并想创建一个 class 方法 return 这个 AthleticCompetitionResults
的对象从行初始化,例如
Siim Susi;12.61;5.00;9.22;1.50;60.39;16.43;21.60;2.60;35.81;5.25.72
Siim Susi2;12.61;5.00;9.22;1.50;60.39;16.43;21.60;2.60;35.81;5.25.72
Jaana Lind;13.75;4.84;10.12;1.50;68.44;19.18;30.85;2.80;33.88;6.22.75
public class AthleticCompetitionResults {
private Athletic athletic;
private float resultM100;
private float resultLongJump;
private float resultShotPut;
private float resultHighJump;
private float resultM400;
private float resultHurdles110m;
private float resultDiscusThrow;
private float resultPoleVault;
private float resultJavelinThrow;
private float resultM1500;
private int points;
public AthleticCompetitionResults(Athletic athletic) {
this.athletic = athletic;
}
public void countPoints(){
//counting
}
// setters and getters
...
已编辑:
我的目标是打印 List<AthleticCompetitionResults>
按积分排序的列表并打印比赛中的位置。如果 points 等于 print 1-2
的地方。示例:
1-2 Siim Susi 4200 pts
1-2 Siim Susi2 4200 pts
3 Jaana Lind 3494 pts
有什么方法可以节省田径比赛的名额? List<Integer>' places in class 'AthleticCompetitionResults
呢?
public class Competition{
private List<AthleticCompetitionResults> athleticsData;
public Competition(List<AthleticCompetitionResults> data){
this.athleticsData = data;
}
public void sortByPoints(){
//sorting by points
}
public void setPlaces(){
//setting athletics places in competition by points
}
public void print(){
//printing e.g 1-2 Siim Susi 4200 pts ...
}
}
最好的方法是将此数据保存在 Map
.
密钥将在 class 中写为 final
。
像这样:
private Map<String, String> valuesMap = new HashMap<String, String>();
public static final String ATHLETIC_NAME = "Athletic_Name";
public static final String FIELD_1 = "Field_1";
public static final String FIELD_2 = "Field_2";
public static final String FIELD_3 = "Field_3";
public static final String FIELD_4 = "Field_4";
public static final String FIELD_5 = "Field_5";
private static final String[] FIELDS_LIST = new String[]{
ATHLETIC_NAME,
FIELD_1,
FIELD_2,
FIELD_3,
FIELD_4,
FIELD_5
};
private void getParametersMap(String values){
System.out.println("Loaded Parameters:");
try{
String[] splitted = values.split(";");
if (splitted.length != FIELDS_LIST.length){
throw new Exception("Unmatched arrays size!!");
}
int i=0;
for (String keyItem : FIELDS_LIST){
valuesMap.put(keyItem, splitted[i++]);
}
System.out.println();
}
catch (Exception e){
e.printStackTrace();
}
}
正在考虑:
并不是所有的事件都会在时间里产生结果
- 例如摔跤、射击)
结果取决于事件类型
- 冲刺有完成时间和排名
- 摔跤有winner/looser
某些事件组的结果属性相似
100米短跑、500米短跑、游泳、马拉松都有完赛时间
标枪,铅球,讨论投掷有距离。
所有赛事都有明显的赢家
我们需要一个策略,以便根据事件类型,我们的结果属性可以改变。
让我们试着写下一些示例代码:
class Result {
protected boolean winner;
..
};
class ThrowingResult extends Result{
protected float range;
..
}
class SprintResult extends Result{
protected double timeToFinishInMilliseconds;
protected int finalPosition;
..
}
class AthleticCompetitionResults{
private Athletic athletic;
private SprintResult resultM100;
private SprintResult resultLongJump;
private ThrowingResult javelin;
private ThrowingResult shotPut;
private Result wrestling;
...
}
如果它是您在此 class 中使用的唯一构造函数,那么将其更改为 builder/factory 不会产生任何显着差异。在这种情况下,我会留在构造函数中。用花哨的模式名称覆盖它不会让它变得更好。