注意!! 知道波兰语或其他具有较强屈曲性的自然语言(最好使用案例系统(例如德语))将有助于回答这个问题。尤其是波兰语的尾数转换系统与其他斯拉夫语言的系统非常相似,例如俄语,捷克语,塞尔维亚语等。

看看这个波兰未完成的declinator:
declinator.com
我正计划将其扩展到其他语言,即俄语和拉丁语,但现在我正与波兰语作斗争。

除了拥有一个庞大的关于数百个名词的偏角的数据库外,我还支持不存在的拒绝名词。
到目前为止,我想到的最好的解决方案是简单地检查名词的结尾,以便可以相应地拒绝它们。

在我的代码中,它归结为该calculateDeclination方法。如果名词不在数据库中,我将其称为。该方法的缺点如下所示:

 if (areLast2Letters(word, "il"))
        declinator = new KamilDeclinator(word);
 else if (areLast2Letters(word, "sk"))
        declinator = new DyskDeclinator(word);
 else if (isLastLetter(word, 'm'))
        declinator = new RealizmDeclinator(word);

等等。这些只是此方法拥有的数十个else if子句的前三个。

示例性declinator的代码如下所示:
import static declining.utils.StringUtils.*;

public class RealizmDeclinator extends realizm_XuXowiX_XemXieXieDeclinator{

    public RealizmDeclinator(String noun) {
        super(noun);
    }

    @Override
    protected String calculateStem() {
        return word;
    }

    @Override
    public String calculateLocative() {
        return swap2ndFromEnd(stem, "ź") + "ie";
    }

    @Override
    public String calculateVocative() {
        return swap2ndFromEnd(stem, "ź") + "ie";
    }
}

所以这是一个问题,还有其他更优雅的算法来减少波兰语单词吗?是否必须有那么多的if else子句?每种类型的名词我都必须写这么多declinator吗?

这个问题向我展示了波兰的变形规则多么简单和令人难以置信。它使我的算法变得乏味且单调。希望你们中的一个可以帮助我使之有趣而简洁!

干杯

最佳答案

尽管我自己是波兰语母语人士,但我的答案将与您程序中的代码模式有关。正如其他人指出的那样,表是必经之路。但是,您可以尝试使用命令模式重构较长的if / else块。有关图表,请参见this page

07-24 22:09