10 changed files with 548 additions and 0 deletions
@ -0,0 +1,179 @@
@@ -0,0 +1,179 @@
|
||||
/* |
||||
* Copyright (C) 2023 niushuai233 niushuai.cc |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package cc.niushuai.demo.designpattern.creatormodel.prototype._01; |
||||
|
||||
import cc.niushuai.demo.designpattern.creatormodel.prototype._01.entity.*; |
||||
import cn.hutool.core.util.SerializeUtil; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Collections; |
||||
import java.util.List; |
||||
import java.util.stream.Collectors; |
||||
|
||||
/** |
||||
* 问题 |
||||
* |
||||
* @author niushuai233 |
||||
* @date 2023/12/22 9:36 |
||||
* @since 0.0.1 |
||||
*/ |
||||
public class QuestionService { |
||||
|
||||
private static List<Question> questions = new ArrayList<Question>(); |
||||
|
||||
static { |
||||
initSelectQuestions(); |
||||
initJudgeQuestions(); |
||||
initAnswerQuestions(); |
||||
} |
||||
|
||||
private static void initSelectQuestions() { |
||||
|
||||
questions.add(createSelectQuestion("下列说法正确的是", |
||||
"JAVA程序中可以有多个main⽅法", |
||||
"JAVA程序的main⽅法必须写在类⾥⾯", |
||||
"JAVA程序的main⽅法中如果只有⼀条语句,可以不⽤{}(⼤括号)括起来", |
||||
"JAVA程序中类名必须与⽂件名⼀样", SelectAnswerEnum.B)); |
||||
questions.add(createSelectQuestion("表达式(11+3*8)/4%3的值是", "2", "1", "31", "0", SelectAnswerEnum.A)); |
||||
questions.add(createSelectQuestion("以下()不是合法的标识符", "void", "de$f", "x3x", "STRING", SelectAnswerEnum.A)); |
||||
questions.add(createSelectQuestion("1+1=?", "4", "2", "3", "1", SelectAnswerEnum.B)); |
||||
questions.add(createSelectQuestion("变量命名规范说法正确的是", |
||||
"变量不能以数字作为开头", |
||||
"A和a在java中是同⼀个变量", |
||||
"不同类型的变量,可以起相同的名字", |
||||
"变量由字⺟、下划线、数字、$符号随意组成", SelectAnswerEnum.D)); |
||||
} |
||||
|
||||
private static Question createSelectQuestion(String title, String optionA, String optionB, String optionC, String optionD, SelectAnswerEnum answer) { |
||||
Question question = new Question(); |
||||
question.setType(QuestionTypeEnum.SELECT); |
||||
question.setTitle(title); |
||||
ArrayList<Option> options = new ArrayList<>(); |
||||
options.add(new Option(SelectAnswerEnum.A, optionA)); |
||||
options.add(new Option(SelectAnswerEnum.B, optionB)); |
||||
options.add(new Option(SelectAnswerEnum.C, optionC)); |
||||
options.add(new Option(SelectAnswerEnum.D, optionD)); |
||||
question.setAnswer(new Answer(answer)); |
||||
question.setOptions(options); |
||||
|
||||
return question; |
||||
} |
||||
|
||||
private static void initJudgeQuestions() { |
||||
questions.add(createJudgeQuestion("5比4多25%, 4比5少20%", true)); |
||||
questions.add(createJudgeQuestion("1+1>2", false)); |
||||
questions.add(createJudgeQuestion("1斤铁比1斤棉花重", false)); |
||||
questions.add(createJudgeQuestion("明天一定会下雨", false)); |
||||
questions.add(createJudgeQuestion("一天有24小时", true)); |
||||
} |
||||
|
||||
private static Question createJudgeQuestion(String title, Boolean answer) { |
||||
Question question = new Question(); |
||||
question.setType(QuestionTypeEnum.JUDGE); |
||||
question.setTitle(title); |
||||
question.setAnswer(new Answer(answer)); |
||||
return question; |
||||
} |
||||
|
||||
private static void initAnswerQuestions() { |
||||
questions.add(createAnswerQuestion("接口一定要有返回值", "不一定")); |
||||
questions.add(createAnswerQuestion("什么床不能睡觉", "⽛床")); |
||||
questions.add(createAnswerQuestion("铁棒打头疼还是⽊棒打头疼", "头最疼")); |
||||
questions.add(createAnswerQuestion("为什么好⻢不吃回头草", "后⾯的草没了")); |
||||
questions.add(createAnswerQuestion("⼩红⻢和⼩⿊⻢⽣的⼩⻢⼏条腿", "4条腿")); |
||||
} |
||||
|
||||
private static Question createAnswerQuestion(String title, String answer) { |
||||
Question question = new Question(); |
||||
question.setType(QuestionTypeEnum.ANSWER); |
||||
question.setTitle(title); |
||||
question.setAnswer(new Answer(answer)); |
||||
return question; |
||||
} |
||||
|
||||
public static List<Question> getQuestions() { |
||||
return disturbQuestionOrder(cloneQuestions()); |
||||
} |
||||
|
||||
private static List<Question> cloneQuestions() { |
||||
List<Question> list = new ArrayList<>(questions.size()); |
||||
|
||||
for (Question question : questions) { |
||||
Question cloneQuestion = SerializeUtil.clone(question); |
||||
list.add(cloneQuestion); |
||||
} |
||||
|
||||
return list; |
||||
} |
||||
|
||||
private static List<Question> disturbQuestionOrder(List<Question> questions) { |
||||
List<Question> list = new ArrayList<>(questions.size()); |
||||
|
||||
List<Question> selectQuestions = questions.stream().filter(item -> QuestionTypeEnum.SELECT.equals(item.getType())).collect(Collectors.toList()); |
||||
// 打乱答案顺序
|
||||
selectQuestions.forEach(QuestionService::disturbAnswerOrder); |
||||
// 选择题乱序
|
||||
Collections.shuffle(selectQuestions); |
||||
|
||||
// 判断题乱序
|
||||
List<Question> judgeQuestions = questions.stream().filter(item -> QuestionTypeEnum.JUDGE.equals(item.getType())).collect(Collectors.toList()); |
||||
Collections.shuffle(judgeQuestions); |
||||
|
||||
// 问答题乱序
|
||||
List<Question> answerQuestions = questions.stream().filter(item -> QuestionTypeEnum.ANSWER.equals(item.getType())).collect(Collectors.toList()); |
||||
Collections.shuffle(answerQuestions); |
||||
|
||||
list.addAll(selectQuestions); |
||||
list.addAll(judgeQuestions); |
||||
list.addAll(answerQuestions); |
||||
|
||||
return list; |
||||
} |
||||
|
||||
private static void disturbAnswerOrder(Question question) { |
||||
if (!QuestionTypeEnum.SELECT.equals(question.getType())) { |
||||
return; |
||||
} |
||||
// 只有选择题需要乱序
|
||||
List<Option> options = question.getOptions(); |
||||
|
||||
// 记录乱序前的正确答案
|
||||
String answerValue = null; |
||||
for (int i = 0; i < options.size(); i++) { |
||||
Option option = options.get(i); |
||||
if (option.getKey().equals(question.getAnswer().getKey())) { |
||||
answerValue = option.getValue(); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
// 打乱顺序
|
||||
Collections.shuffle(options); |
||||
|
||||
// 找出乱序后的正确答案
|
||||
SelectAnswerEnum[] values = SelectAnswerEnum.values(); |
||||
for (int i = 0; i < options.size(); i++) { |
||||
Option option = options.get(i); |
||||
// 设置新key
|
||||
option.setKey(values[i]); |
||||
// 如果新key是答案 记录新key
|
||||
if (option.getValue().equals(answerValue)) { |
||||
question.setAnswer(new Answer(option.getKey())); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,94 @@
@@ -0,0 +1,94 @@
|
||||
/* |
||||
* Copyright (C) 2023 niushuai233 niushuai.cc |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package cc.niushuai.demo.designpattern.creatormodel.prototype._01; |
||||
|
||||
import cc.niushuai.demo.designpattern.creatormodel.prototype._01.entity.Option; |
||||
import cc.niushuai.demo.designpattern.creatormodel.prototype._01.entity.Question; |
||||
import cc.niushuai.demo.designpattern.creatormodel.prototype._01.entity.QuestionTypeEnum; |
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
import java.util.stream.Collectors; |
||||
|
||||
/** |
||||
* 学生 |
||||
* |
||||
* @author niushuai233 |
||||
* @date 2023/12/28 16:40 |
||||
* @since 0.0.1 |
||||
*/ |
||||
@Data |
||||
public class Student { |
||||
|
||||
private String stuNo; |
||||
private String name; |
||||
|
||||
private List<Question> questions; |
||||
|
||||
public Student(String stuNo, String name, List<Question> questions) { |
||||
this.stuNo = stuNo; |
||||
this.name = name; |
||||
this.questions = questions; |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
|
||||
StringBuilder sb = new StringBuilder(); |
||||
sb.append("======================================================================================").append(System.lineSeparator()); |
||||
sb.append("学号: ").append(stuNo).append(System.lineSeparator()); |
||||
sb.append("姓名: ").append(name).append(System.lineSeparator()); |
||||
sb.append("---------------------------------------------------------------------------------------").append(System.lineSeparator()); |
||||
sb.append("一、选择题").append(System.lineSeparator()); |
||||
|
||||
List<Question> selectQuestions = questions.stream().filter(item -> QuestionTypeEnum.SELECT.equals(item.getType())).collect(Collectors.toList()); |
||||
for (int i = 0; i < selectQuestions.size(); i++) { |
||||
Question question = selectQuestions.get(i); |
||||
|
||||
List<Option> options = question.getOptions(); |
||||
|
||||
sb.append((i + 1) + "、\t").append(question.getTitle()).append(System.lineSeparator()); |
||||
for (Option option : options) { |
||||
sb.append("\t").append(option.getKey()).append(": ").append(option.getValue()).append(System.lineSeparator()); |
||||
} |
||||
sb.append("答案: ").append(question.getAnswer().getKey()).append(System.lineSeparator()); |
||||
} |
||||
sb.append(System.lineSeparator()); |
||||
|
||||
sb.append("二、判断题").append(System.lineSeparator()); |
||||
List<Question> judgeQuestions = questions.stream().filter(item -> QuestionTypeEnum.JUDGE.equals(item.getType())).collect(Collectors.toList()); |
||||
for (int i = 0; i < judgeQuestions.size(); i++) { |
||||
Question question = judgeQuestions.get(i); |
||||
sb.append((i + 1) + "、\t").append(question.getTitle()).append(" ( )").append(System.lineSeparator()); |
||||
sb.append("答案: ").append(question.getAnswer().getCorrect()).append(System.lineSeparator()); |
||||
} |
||||
sb.append(System.lineSeparator()); |
||||
|
||||
sb.append("二、判断题").append(System.lineSeparator()); |
||||
List<Question> answerQuestions = questions.stream().filter(item -> QuestionTypeEnum.ANSWER.equals(item.getType())).collect(Collectors.toList()); |
||||
for (int i = 0; i < answerQuestions.size(); i++) { |
||||
Question question = answerQuestions.get(i); |
||||
sb.append((i + 1) + "、\t").append(question.getTitle()).append(" ( )").append(System.lineSeparator()); |
||||
sb.append("答案: ").append(question.getAnswer().getAnswer()).append(System.lineSeparator()); |
||||
} |
||||
sb.append("======================================================================================").append(System.lineSeparator()); |
||||
sb.append(System.lineSeparator()); |
||||
|
||||
|
||||
return sb.toString(); |
||||
} |
||||
} |
@ -0,0 +1,61 @@
@@ -0,0 +1,61 @@
|
||||
/* |
||||
* Copyright (C) 2023 niushuai233 niushuai.cc |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package cc.niushuai.demo.designpattern.creatormodel.prototype._01.entity; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import java.io.Serializable; |
||||
|
||||
/** |
||||
* 答案 |
||||
* |
||||
* @author niushuai233 |
||||
* @date 2023/12/20 17:06 |
||||
* @since 0.0.1 |
||||
*/ |
||||
@Data |
||||
public class Answer implements Serializable { |
||||
|
||||
private static final long serialVersionUID = 7089356236006618280L; |
||||
|
||||
/** |
||||
* 问答题正确答案 |
||||
*/ |
||||
private String answer; |
||||
|
||||
/** |
||||
* 选择题正确答案 |
||||
*/ |
||||
private SelectAnswerEnum key; |
||||
|
||||
/** |
||||
* 判断题正确答案 |
||||
*/ |
||||
private Boolean correct; |
||||
|
||||
public Answer(String answer) { |
||||
this.answer = answer; |
||||
} |
||||
|
||||
public Answer(SelectAnswerEnum key) { |
||||
this.key = key; |
||||
} |
||||
|
||||
public Answer(Boolean correct) { |
||||
this.correct = correct; |
||||
} |
||||
} |
@ -0,0 +1,40 @@
@@ -0,0 +1,40 @@
|
||||
/* |
||||
* Copyright (C) 2023 niushuai233 niushuai.cc |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package cc.niushuai.demo.designpattern.creatormodel.prototype._01.entity; |
||||
|
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Data; |
||||
|
||||
import java.io.Serializable; |
||||
|
||||
/** |
||||
* 选项 |
||||
* |
||||
* @author niushuai233 |
||||
* @date 2023/12/22 9:28 |
||||
* @since 0.0.1 |
||||
*/ |
||||
@Data |
||||
@AllArgsConstructor |
||||
public class Option implements Serializable { |
||||
|
||||
private static final long serialVersionUID = -4732258966292936442L; |
||||
|
||||
private SelectAnswerEnum key; |
||||
|
||||
private String value; |
||||
} |
@ -0,0 +1,44 @@
@@ -0,0 +1,44 @@
|
||||
/* |
||||
* Copyright (C) 2023 niushuai233 niushuai.cc |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package cc.niushuai.demo.designpattern.creatormodel.prototype._01.entity; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import java.io.Serializable; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 问题 |
||||
* |
||||
* @author niushuai233 |
||||
* @date 2023/12/20 17:06 |
||||
* @since 0.0.1 |
||||
*/ |
||||
@Data |
||||
public class Question implements Serializable { |
||||
|
||||
private static final long serialVersionUID = -860553158276002337L; |
||||
|
||||
private String title; |
||||
|
||||
private QuestionTypeEnum type; |
||||
|
||||
private List<Option> options; |
||||
|
||||
private Answer answer; |
||||
|
||||
} |
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
/* |
||||
* Copyright (C) 2023 niushuai233 niushuai.cc |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package cc.niushuai.demo.designpattern.creatormodel.prototype._01.entity; |
||||
|
||||
/** |
||||
* 问题类型 |
||||
* |
||||
* @author niushuai233 |
||||
* @date 2023/12/22 9:29 |
||||
* @since 0.0.1 |
||||
*/ |
||||
public enum QuestionTypeEnum { |
||||
SELECT, ANSWER, JUDGE |
||||
} |
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
/* |
||||
* Copyright (C) 2023 niushuai233 niushuai.cc |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package cc.niushuai.demo.designpattern.creatormodel.prototype._01.entity; |
||||
|
||||
/** |
||||
* 选择题答案枚举 |
||||
* |
||||
* @author niushuai233 |
||||
* @date 2023/12/22 9:34 |
||||
* @since 0.0.1 |
||||
*/ |
||||
public enum SelectAnswerEnum { |
||||
A, B, C, D, E, F, G, H |
||||
} |
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
/* |
||||
* Copyright (C) 2023 niushuai233 niushuai.cc |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
/** |
||||
* 原型设计模式 |
||||
* |
||||
* @author niushuai233 |
||||
* @date 2023/12/20 17:05 |
||||
* @since 0.0.1 |
||||
*/ |
||||
package cc.niushuai.demo.designpattern.creatormodel.prototype; |
@ -0,0 +1,43 @@
@@ -0,0 +1,43 @@
|
||||
/* |
||||
* Copyright (C) 2023 niushuai233 niushuai.cc |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package cc.niushuai.demo.designpattern.creatormodel.prototype._01; |
||||
|
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
/** |
||||
* question test |
||||
* |
||||
* @author niushuai233 |
||||
* @date 2023/12/29 10:33 |
||||
* @since 0.0.1 |
||||
*/ |
||||
public class QuestionTest { |
||||
|
||||
|
||||
@Test |
||||
public void questionTest() { |
||||
|
||||
Student zhangsan = new Student("STU001", "张三", QuestionService.getQuestions()); |
||||
Student lisi = new Student("STU001", "李四", QuestionService.getQuestions()); |
||||
Student wanger = new Student("STU001", "王二", QuestionService.getQuestions()); |
||||
|
||||
System.out.println(zhangsan); |
||||
System.out.println(lisi); |
||||
System.out.println(wanger); |
||||
|
||||
} |
||||
} |
Loading…
Reference in new issue