扫描仪类:检测单词中的音节

时间:2012-11-15 12:51:30

标签: java java.util.scanner

我一直在为大学的小组项目创建一个Pig Latin翻译器(我们不必实际制作翻译器,只是以我们想要的任何方式操纵字符串,我选择了这个)。

我翻译的输入是拉丁语祈祷,前两行是:

credo in unum deum 
patrem omnipotentem 

我使用以下代码创建了我的翻译器:

public static void pigLatinify(String fname) throws IOException 
{
    File file = new File("projectdata.txt");

    try 
    {
        Scanner scan1 = new Scanner(file);
        while (scan1.hasNextLine()) 
        {
            Scanner scan2 = new Scanner(scan1.nextLine());
            boolean test2;
            while (test2 = scan2.hasNext())
            {
                String s = scan2.next();
                char firstLetter = s.charAt(0);
                if (firstLetter=='a' || firstLetter=='i' || firstLetter=='o' || firstLetter=='e' || 
                        firstLetter=='u' || firstLetter=='A' || firstLetter=='I' || firstLetter=='O' || 
                        firstLetter=='E' || firstLetter=='U')
                {
                    String output = s + "hay" + " ";
                    System.out.print(output);
                }
                    else
                    {
                        String restOfWord = s.substring(1);
                        String output = restOfWord + firstLetter + "ay" + " ";
                        System.out.print(output);
                    }
                }
                System.out.println("");
            }
            scan1.close();
        } 

        catch (FileNotFoundException e) 
        {
            e.printStackTrace();
        }
    }
}

它输出整个祈祷井,前两行输出如下:

redocay inhay unumhay eumday 
atrempay omnipotentemhay

然而,在真正的猪拉丁语中,单音节词保持不变并且在末尾添加了“-hay”,因此“it”变为“ithay”,“egg”变为“egghay”,但多个音节词有“ - 方式“添加到最后,所以”射箭“变成”射箭“和”结束“变成”结束“。

Java(以及我正在使用的扫描仪类)是否有办法检测单词是否为单音节?

此时我还会指出我只是一个初学程序员,所以如果有,但它非常复杂,请随意说!! {/ p>

3 个答案:

答案 0 :(得分:0)

我认为你的困难不在于编写Java,而在于建立一个简单的单词计数音节的规则。对于你的语言,我倾向于为一个单词中的每个连续元音计算一个音节,但不要将终端e作为音节的证据。

所以,

eat有一个音节,只有一个元音;

ate有一个,两个元音,少于一个终端e

eight有一个音节

eighteen有两个

funicular有四个

我很确定你会找到这套简单规则的反例,但也许它们足以让你开始。

答案 1 :(得分:0)

如果你想要正确地做,你将不得不找到一个带有音节的拉丁字典。拉丁语是相当规律的,但也有例外。像http://athirdway.com/glossa/这样的字典有scansion

crēdo, dĭdi, dĭtum

但一次只能提供一个字。您还必须为音节编写解析器。我之所以提到这一点是因为人们的语言很容易解析和解释 - 它们通常不是!

答案 2 :(得分:0)

如何获得这样的音节数:

/**
 * Get the number of syllables for a given word
 * @param s the given word
 * @return the number of syllables
 */
public static int getNumberOfSyllables(String s) {
    s = s.trim();
    if (s.length() <= 3) {
        return 1;
    }
    s = s.toLowerCase();
    s = s.replaceAll("[aeiouy]+", "a");
    s = "x" + s + "x";
    return s.split("a").length - 1;
}