2013-05-16 55 views
-1

我试图从包含大量单词的ArrayList中创建一个N-gram列表。 我当前的代码如下所示:从ArrayList创建一个n-gram列表

public void ngram(int n){ 
    int i = 0; 
    for(String a : arraylist){ 
     if (i < arraylist.size() - 2) { 
    ngramlist.add(arraylist.get(i) + " " + arraylist.get(i+1) + " " + arraylist.get(i+2)); 
    i++; 
    } 
    } 
    System.out.println(ngramlist); 
} 

其中的ArrayList是用言语和ngramlist列表是列表我想从数组列表创建。 此代码有效,但不是我想要的。如果我输入像“猫狗鸟椅桌”这样的文字,输出将是“猫狗鸟,狗鸟椅,鸟椅桌”。 我试图完成的事情是,我可以使用变量n输入我想要在一行中添加的字数。所以如果我把2换成n,那它就是“猫狗,狗鸟,鸟椅,椅子桌子”。

所以我想我的代码是这样的:

public void ngram(int n){ 
    int i = 0; 
    for(String a : arraylist){ 
     if (i < arraylist.size() - n) { 

    (add all the words between i and i+n, so if n is 3 it adds 0-2, 1-3, 2-4 etc.) 

    i++; 
    } 
    } 
    System.out.println(ngramlist); 
} 
+5

对代码块使用一致的逻辑缩进。代码的缩进旨在帮助人们理解程序流程。 –

回答

0

所以你可以使用里面另一个循环的主要原因之一:

String ngram = ""; 
for (int j = 0; j < n-1; j++) 
    ngram += arraylist.get(i + j) + " "; 
ngram += arraylist.get(i + n - 1); 
ngramlist.add(ngram); 

我同意这可能是低效的,因为它创建了很多字符串,但否则它很简单,它应该工作。 (编辑:实际上,我在想,如果它们存储在字符串池中,它可能不应该那么糟糕)

1

使用StringBuilder

for(String a : arraylist){ 
    if (i < arraylist.size() - n) { 
     StringBuilder sb = new StringBuilder(); 
     for (int j = 0; j < n-1; j++) { 
      sb.append(arraylist.get(i+j)).append(" "); 
     } 
     sb.append(arraylist.get(i+n-1)); 
     ngramlist.add(sb.toString()); 
     i++; 
    } 
} 
+0

我想'sb.append(arraylist.get(i + n));'是不需要的,因为它是从arrayList中添加一个项目,这是不正确的。我运行它n = 2,但它输出的结果为n = 3。通过消除这条线它完美! – Sudhir

+0

通过这种方式,您还将在n-gram中的最后一个单词旁边获得一个空格(这是该行所做的,它添加了最后一个单词但没有空格)。更好的解决方案是先停止循环:'for(int j = 0; j anana

+0

@Sudhir我被你的第一个代码片段弄糊涂了,我把它解释为'n == 2',但显然那是'n == 3' ... –