2014-02-26 70 views
0

我試圖創建一個接受三個參數分區功能:文本字符串,模式字符串和整數k。Java的分區方法

目標是長度爲m的圖案的內容存儲在一個字符串數組K + 1個片段,其中每個片段是一個長度爲M/K + 1(或接近)的。 例如,如果字符串「ABCDEFGHIJKLMNOPQRSTUVWXYZ」進行解析,以該方法,其中k = 2 數組應看起來像這樣[ABCDEFGHI,JKLMNOPQ,RSTUVWXYZ]

該程序當m/K + 1被劃分均勻運行正常,但是當結果產生餘數時,結果是關閉的。我注意到錯誤似乎與米/ k的餘數+ 1

這是我有問題的代碼的部分對應:

public static String[] partition(String text, String pattern, int k) { 

    String[] fragment = new String[k+1]; 
    int f = k+1; 
    int m = pattern.length(); 
    int fragmentSize = (int)Math.floor(m/f); 
    int lastCharIndex; 

    // cannot partition evenly{ 
     int i = 0; 
     while(i < f) { 
      // set the first partition as the largest 
      if(fragment[i] == fragment[0]) { 
       fragmentSize = (int)Math.ceil(m/f); 
       lastCharIndex = i * fragmentSize; 
       fragment[i] = pattern.substring(lastCharIndex, lastCharIndex+fragmentSize); 
      } 
      else { 
       fragmentSize = (int)Math.floor(m/f); 
       lastCharIndex = i * fragmentSize; 
       fragment[i] = pattern.substring(lastCharIndex, lastCharIndex+fragmentSize); 
      } 
      i++; 

     } 

    return fragment; 

使用輸出上面的例子我目前收到的是[ABCDEFGHI,IJKLMNOP,QRSTUVWX]

我有一種感覺,它與fragmentSize的顯式轉換有關,但我無法找出解決方法。 任何幫助將不勝感激。

回答

0

你的邏輯是不正確。假設你有26個字母,並且需要3個片段。這使得9個元素的第一個片段,9個元素的第二個,以及8個元素中的最後一個。

您的邏輯使長度爲8的每個片段(floor(26/3))除第一個長度爲9(ceil(26/3))之外。不僅如此,還可以將第一個片段的附加字母添加到第二個片段中。

邊注:測試if(fragment[i] == fragment[0])其實應該if (i == 0)。而且你應該讓你的數字加倍以避免丟失小數部分。

+0

非常感謝!我能夠解決你的建議:-) – user3341198

0

你的所有操作都與int製成,這意味着兩件事情:

  • 他們也產生int和你失去小數部分
  • 你到Math.ceilMath.floor電話是沒用的:他們需要一個雙作爲參數,但已經得到一個int(當你傳遞一個只涉及int的操作的結果)時,沒有樓層或者ceil被創建。

聲明fm時,你應該開始使用double

double f = (double) k+1; 
double m = (double) pattern.length();