2013-05-16 117 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' ... –