我正在制作一个单词定义测验应用程序,我的单词及其定义列表是JSON,结构如下:
"words": [
{
"word": "rescind",
"type": "verb",
"definition": "to take back, repeal as in a rule or policy"
},
{
"word": "curtail",
"type": "verb",
"definition": "to reduce or lessen"
},
等等。
在测验中,您将获得一个随机选择的单词,以及五个可供选择的定义。就像标准化的多项选择测试一样。
现在,我开始看到的一个问题是我的词语含义非常相似。我目前从列表中随机选取了4个错误的定义,但为了避免混淆,我想避免选择与正确选择类似的定义。
我应该如何创建这个“相似性”地图?我想到的一个解决方案是:
{
"word": "avid",
"type": "adjective",
"definition": "extremely excited about, enthusiastic about",
"similar to": [
"ardent",
"fervent"
]
},
但是我意识到这个解决方案有点糟糕,因为我必须互相转向并实现相同的列表,当我最终添加很多很多时,它会让真正的笨重来编辑词语的
那么你们认为什么是最好的解决方案?
答案 0 :(得分:3)
一个简单的第一种方法是创建一个带有字段的Word
类。
确保使用“word”字段覆盖equals()
和hashCode()
(我调用dit“value”以区别于类名)(见下文):
public class Word {
private final String value;
private final String type;
private final String definition;
private final List<Word> synonymns = new ArrayList<Word>();
public Word(String value, String type, String definition) {
this.value = value;
this.type = type;
this.definition = definition;
}
// equals() and hashCode() based on the value field
@Override
public int hashCode() {
return value.hashCode();
}
@Override
public boolean equals(Object obj) {
return obj instanceof Word && ((Word)obj).value.equals(value);
}
public String getValue() {
return value;
}
public String getType() {
return type;
}
public String getDefinition() {
return definition;
}
public List<Word> getSynonymns() {
return synonymns;
}
}
根据值字段实施equals()
和hashCode()
意味着您可以使用Set来防止重复:
Set<Word> words = new HashSet<Word>(); // wont allow two Word objects with the same value
您可以使用Set.add()
的返回值,如果该集合尚未包含指定元素,则返回true,以检查正在添加的单词是否实际上是唯一的:
Word word = new Word("duplicate", "adjective", "another copy");
if (!words.add(word)) {
// oops! set already contained that word
}
如果您想添加特殊酱汁,请将type
设为枚举:
public enum PartOfSpeach {
NOUN,
VERB, // in USA "verb" includes all nouns, because any noun can be "verbed"
ADJECTIVE,
ADVERB
}
您可以考虑允许单词属于多种类型:
事实上,您可能会考虑为每个单词赋予多种含义:
public class Meaning {
PartOfSpeach p;
String definition;
List<Word> synonyms; // synonyms belong to a particular *meaning* of a Word.
}