用Java构建一个人格测试应用程序
如果你想建立一个人格测试应用或测验应用,这篇文章是为你准备的。本文将使用Java数组的概念、StringBuilder类、异常处理和Java中的格式指定器来制作一个人格测试应用程序。
人格测试是如何进行的
根据伊莎贝尔-布里格斯-迈尔斯(Isabel Briggs Myers)的说法,有十六种人格特征,而将人分为不同的十六种人格特征,有四个关键要素。
这四个关键要素是。
- 内向型(I)或外向型(E)。
- 感性(S)或直觉(N)。
- 思考(T)或感觉(F)。
- 判断(J)或感知(P)。
前提条件
要继续学习本教程,你需要具备以下条件。
- Java JDK 8.0及以上版本。
- 一个Java IDE。
- PDF格式的[测试题]。
Java数组简介
数组的定义
Java中的数组是一组具有相同数据类型的元素,可以是原始类型也可以是引用类型。Java可以创建一维数组和多维数组。
一个单维数组可以表示为相同数据类型的列表,通常在一个方括号中定义。相比之下,多维数组描绘的是一个有行和列的表格结构。
数组的声明
我们像这样声明一个单维数组。
int [ ] oneDarray;
在这一点上,一个数组对象还没有被创建。
它类似于这样声明一个整数。
int number;
我们像这样声明一个二维数组。
int [ ][ ] twoDarray;
方括号表示尺寸;例如,一个三维数组将有三个方括号。int意味着每个元素的数据类型是整数类型,我们给我们的数组一个变量名。
变量名是一个引用名,可以是任何东西,尽管我们要遵守Java的命名惯例。
int [ ] oneDarray, numbers[];
// is the same as
int oneDarray [], numbers[][];
如何创建数组
我们用new关键字或数组字面来创建数组。数组的索引是一个固定的大小。每个元素都有其各自的默认值。
用new关键字创建一个数组
我们像这样创建一个空数组。
int[ ] emptyArray = new int[0]; // this is an empty array
下面是一个整数的数组。有四个位置,默认值是零。
int [] arrayInt = new int [4] // array of integers;
我们设置了一个包含四个位置的整数数组。
接下来,我们将看到一个围绕每个位置的循环,并打印出每个位置的值。
for (int i=0; i < arrayInt.length; i++) {
System.out.println(arrayInt[i]);
}
有四个索引的对象数组,所有参考类型的默认值都是空。
Object[] arrOfObjects = new Objects[4]; // array of Objects
String [] arrayOfStrings= new int [4] // array of Strings;
用数组字头创建数组
String [ ] subjects = {“English”,”Mathematics”};
每当我们用数组字样声明和初始化一个数组时,除了布尔数据类型,我们就不需要new关键字。
我们像这样声明和初始化布尔值。
boolean [ ] boolValues = new boolean { true,false,true,false};//exception to array literal rule.
通过使用数组的索引来改变一个特定元素的值。
String [] oneDstringValue ={“room”, ”door”}
oneDstringValue [1] = “stores”;
现在我们简单介绍了一下Java数组的一些基础知识,让我们深入到构建我们的应用程序。
构建人格测试应用程序
第一步:创建一个名为PersonalityTest.java的文件。
在这个文件中,像这样定义一个同名的PersonalityTest类。
public class PersonalityTest {
第二步:定义主方法
public static void main(String[] args) {
第三步:对问题进行编号
声明并初始化一个整数变量,用于给你的问题编号。它是在类中而不是在主方法中声明和分配的,因为它是一个静态变量。
static int questionNumber = 1;
第四步:使用数组字元为问题创建数组
在我们的主方法中,让我们用数组字样声明并初始化我们的问题数组。
对于我们的应用程序,我们将存储字符串,所以我们可以像这样在我们的数组中存储值。
String[] extroversionVsIntroversionTest = {
"A. expend energy, enjoy groups. B. conserve energy, enjoy one-on-one",
"A. more outgoing, think out loud. B. more reserved, think to yourself",
"A. seek many tasks, public activities, interaction with others. "+
"B. seek private, solitary activities with quiet to concentrate,"
"A.external, communicative, express yourself. B. internal, reticent, keep to yourself",
"A. active, initiate. B. reflective, deliberate"};
String[] sensingVsIntuitionTest = {
"A. interpret literally. B. look for meaning and possibilities",
"A. practical, realistic, experiential. B. imaginative, innovative, theoretical",
"A. standard, usual, conventional. B. different, novel, unique",
"A. focus on here-and-now\" .B.look to the future, global perspective, \"big picture\"",
"A. facts, things, \ "what is\". B. ideas, dreams, \ "what could be,\" philosophical"
};
String[] thinkingVsFeelingTest = {
"A. logical, thinking, questioning. B. empathetic, feeling, accommodating",
"B. candid, straight forward, frank. B.tactful, kind, encouraging",
"A. firm, tend to criticize, hold the line. B. gentle, tend to appreciate, conciliate",
"A. tough-minded, just B.tender-hearted, merciful",
"A. matter of fact, issue-oriented B. sensitive, people-oriented, compassionate",
};
String[] judgingVsPerceivingTest = {
"A. organized, orderly. B. flexible, adaptable",
"A. plan, schedule B. unplanned, spontaneous",
"A. regulated, structured B. easygoing, "live\" and "let live\"",
"A. preparation, plan ahead. B. go with the flow, adapt as you go",
"A. control, govern B. latitude, freedom"};
第五步:用新的关键字为答案创建数组
我们将用它们来收集用户的A和B的输入,然后以0和1的形式保存到我们的数组中。记住,默认情况下,int在数组中等于0。
Java现在知道我们想要一个带索引的整数数组。一旦Java执行了这几行,就会给数组分配一个默认值;因为我们有一个整数数组,所有的位置都会有一个相同的默认值0作为它们的值。
int[] extrovertVsIntrovertAnswersStorage = new int[5];
int[] sensingVsIntuitionsAnswersStorage = new int[5];
int[] thinkingVsFeelingAnswersStorage = new int[5];
int[] judgingVsPerceivingAnswersStorage = new int[5];
第六步:创建一个StringBuilder对象
StringBuilder类被用来创建一个可变的String。下面的代码示例创建了一个空的StringBuilder,默认容量为16。
必须指出的是,StringBuilder类比实现一个空字符串更有效率。每次我们向空字符串添加时都会创建一个对象,这往往会降低效率。
StringBuilder result = new StringBuilder();
第七步:提供问题并收集答案
这个方法提供问题,并从控制台得到A或B的答案,但将它们以0和1的形式保存在我们的数组中。
iterate(extroversionVsIntroversionTest,extrovertVsIntrovertAnswersStorage);
iterate(sensingVsIntuitionTest,sensingVsIntuitionsAnswersStorage);
iterate(thinkingVsFeelingTest,thinkingVsFeelingAnswersStorage);
iterate(judgingVsPerceivingTest,judgingVsPerceivingAnswersStorage);
第八步:计算答案
找到数组中的数字之和。
int sumOfAsInExtroversion = sum(extrovertVsIntrovertAnswersStorage);
int sumOfAsInSensing = sum(sensingVsIntuitionsAnswersStorage);
int sumOfAsInThinking = sum(thinkingVsFeelingAnswersStorage);
int sumOfAsInJudging = sum(judgingVsPerceivingAnswersStorage);
第九步:角色打字
我们调用String builder类中的append方法,并比较测试结果。
// appends personality type accordingly
if (sumOfAsInExtroversion < 3) result.append("I");
else {
result.append("E");
}
if (sumOfAsInSensing < 3) result.append("N");
else {
result.append("S");
}
if (sumOfAsInThinking < 3) result.append("F");
else {
result.append("T");
}
if(sumOfAsInJudging < 3) result.append("P");
else{
result.append("J");
}
第十步:在表格中显示性格类型
在一个表格中打印个性结果。
System.out.println("\nYour choice at a glance\n");
下面的代码示例显示了我们表格的标题。
System.out.printf("|%5s | %3s | %3s | %3s | %3s | %3s | %3s | %3s | %3s | %3s | %3s | %3s |%n", " ", "A", "B"," ", "A", "B", " ", "A", "B", " ", "A", "B");
我们将问题的数量设置为1,因为我们想在表中显示所有的问题编号。
int numbering = 1;
下面的代码样本在一行中重复了74次'-'。我们用它来划分我们的表格部分。
System.out.printf("%s%n", "-".repeat(74));
下面的代码样本显示表格中的问题数量。它的范围从1到20。然后,我们使用我们的方法对用户的选项进行相应的标记。
for (int i = 0; i< extrovertVsIntrovertAnswersStorage.length; i++) {
System.out.printf("|%5d | %3s | %3s | %3d | %3s | %3s | %3d | %3s | %3s | %3d | %3s | %3s |%n", numbering++,
placeCheckmark(extrovertVsIntrovertAnswersStorage[i],1),
placeCheckmark(extrovertVsIntrovertAnswersStorage[i], 2),
numbering++, placeCheckmark(sensingVsIntuitionsAnswersStorage[i], 1),
placeCheckmark(sensingVsIntuitionsAnswersStorage[i], 2),
numbering++,
placeCheckmark(thinkingVsFeelingAnswersStorage[i], 1),
placeCheckmark(thinkingVsFeelingAnswersStorage[i], 2), numbering++,
placeCheckmark(judgingVsPerceivingAnswersStorage[i], 1),
placeCheckmark(judgingVsPerceivingAnswersStorage[i], 2));
}
System.out.printf("%s%n", "-".repeat(74));
下面的代码样本在表格中显示了A和B在数组中存在的时间数量,同时也显示了个性类型。
System.out.printf("|%5s | %3d | %3d | %3s | %3d | %3d | %3s | %3d | %3d | %3s | %3d | %3d |%n", "TOTAL",countNumbers(extrovertVsIntrovertAnswersStorage, 1), countNumbers(extrovertVsIntrovertAnswersStorage, 0),
" ", countNumbers(sensingVsIntuitionsAnswersStorage, 1), countNumbers(sensingVsIntuitionsAnswersStorage, 0), " ",
countNumbers(thinkingVsFeelingAnswersStorage, 1),
countNumbers(thinkingVsFeelingAnswersStorage, 0), " ",
countNumbers(judgingVsPerceivingAnswersStorage, 1), countNumbers(judgingVsPerceivingAnswersStorage, 0));System.out.printf("%s%n", "-".repeat(74)); System.out.printf("|%5s | %3s | %3s | %3s | %3s | %3s | %3s | %3s | %3s | %3s | %3s | %3s |%n", " ", "E", "I"," ", "S", "N", " ", "T", "F", " ", "J", "P");
System.out.println("Your personality type is " + result);
下面的代码样本显示了关于用户个性身份信息的网站链接。
System.out.print("For your personality interpretation, visit : ");
System.out.println("https://www.truity.com/page/16-personality-types-myers-briggs");
}
解释这些方法
这个方法处理异常,并在我们的I/O操作中忽略了空白和大写。
所有的方法都是静态的,所以我们必须在main方法之外声明它们,并在其中调用它们。
public static String getOption(Scanner input){
String option;
while (true){
try {
option = input.nextLine();
if(option.trim().equalsIgnoreCase("A".trim()) || option.trim().equalsIgnoreCase("B".trim())){
return option;
}else {
throw new IllegalArgumentException("Wrong choice; choose A or B");
}
}catch (IllegalArgumentException ex){
System.err.println(ex.getMessage());
}
}
}
提供问题和获取选项的方法
这个方法需要两个数组。第一个数组包含问题列表,而第二个数组默认包含0。我们的目的是向用户收集一个选项。
如果选项是A,它就把它作为1保存到我们的集合中。另外,如果选择是B,它就保留默认值(答案列表中的默认值是0)。
public static void iterate(String[] questions, int[] answers) {
Scanner scanner = new Scanner(System.in);
String optionAorB;
for (int number = 0; number < questions.length; number++) {
System.out.printf("Question %d%n", questionNumber++);
System.out.println(questions[number]);
System.out.println("Pick an option: A or B");
optionAorB = getOption(scanner);
if ((optionAorB.equalsIgnoreCase("A"))){
answers[number] = 1;
}
}
}
对A和B的数量进行求和的方法
这个方法接收一个数字数组,并返回其中的数字之和。因此,我们用它来计算各级答案中的A和B的数量。
这使我们能够用if语句设置一个人格类型。记住,A表示为1,B表示为0。
public static int sum(int[] intArrays){
int sum = 0;
for(int number : intArrays) sum += number;
return sum;
}
格式指定器方法
这个方法用于在每个选项上打勾。我们只在我们的表格中使用它。
public static String placeCheckmark(int num, int position){
return (num == 1 && position == 1) || (num == 0 && position == 2) ? String.format("%c", '\u2713') : "";
}
计算数组中零和一的数量的方法
这个方法需要一个数组和一个数字。它找出该数字在数组中存在的次数。
public static int countNumbers(int[] numArray, int number){
int count = 0;
for(int num : numArray){
if(num == number) count++;
}
return count;
}
总结
在这篇文章中,我们学习了与数组、格式指定器、方法和异常处理有关的工作。