我使用的是名为Mallet的库。它是迄今为止我用过的最复杂的Java库。他们提供教程和代码模板,我试图理解它。但是,我遇到了这行代码:
TransducerEvaluator evaluator = new MultiSegmentationEvaluator(
new InstanceList[]{trainingData, testingData},
new String[]{"train", "test"}, labels, labels) {
@Override
public boolean precondition(TransducerTrainer tt) {
// evaluate model every 5 training iterations
return tt.getIteration() % 5 == 0;
}
};
请不要过分关注术语"换能器"。什么传递给这个功能?两节课?这是new String[]{}
的内容是什么?我对此语法非常困惑,因为我以前从未见过它。
这是此方法的代码:
public MultiSegmentationEvaluator (InstanceList[] instanceLists, String[] instanceListDescriptions,
Object[] segmentStartTags, Object[] segmentContinueTags)
有人能告诉我这个怪异的构造是什么吗?
答案 0 :(得分:1)
这个结构做了几件事:
MultiSegmentationEvaluator
的子类,而不为其命名precondition(TransducerTrainer tt)
方法labels
传递给带有四个参数的构造函数来实例化新定义的匿名类。evaluator
变量。代码使用Java的匿名类功能 - 当您必须子类化或实现接口时,这是一个非常方便的工具,但您定义的类仅用于程序中的一个位置。
答案 1 :(得分:0)
考虑以下代码:
String[] stringArr = new String[]{"train", "test"};
现在有意义了吗?它是一个String数组! =)这里有更愚蠢的代码来证明我的观点:
new String[]{"train", "test"}.getClass() == String[].class
答案 2 :(得分:-1)
InstanceList[]
意味着你需要有一个类型为InstanceList的对象列表,String []也是如此 对于这些:
Object[]
表示任何Object的子类(任何对象)都可以作为最后两个参数的参数传递。
在顶部代码中,这正是他们正在做的事情,但他们为InstanceList和String创建新对象,然后标签是他们传递的2个对象。