<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-16  評論-50  文章-2  trackbacks-0

    摘要:全排列是組合數學中的基本問題。求全排列有很多方法,比如:遞歸算法、字典順序法、遞增/遞減進位制數法和鄰位對換法等。本文就在Java、JUnit4平臺中,采用測試驅動開發方法,通過實現全排列,來學習Java SE 5中的泛化編程。

    關鍵字:全排列 Java JUnit 測試驅動開發 泛化

    首先寫個測試

    image

    以最快的方式,通過編譯,并讓測試通過。

    在eclipse中通過使用快捷鍵 Ctrl + 1 ,可以快速生成Stob。

    image

    編譯通過,測試通過。

    發現問題:(task list)

    • length方法中的6是怎么來的?
    • 排列中的元素可不僅僅是String
    • 排列中的元素個數,很有可能不是3個。
    • 獲取排列中的元素

    重構代碼。

     

    排列中的元素個數,很有可能不是3個。

    image

    采用了Java SE 5中最新的特性:可變參數。vararg。這樣可以傳入任意個元素,或一個元素數組。然后,并重命名了參數。

     

    排列中的元素可不僅僅是String

    修改測試代碼

    image

    出現了編譯錯誤。這次Ctrl + 1 不會自動解決問題。修改Arrangement類。

    image

     

    獲取排列中的元素

    在測試testArrange中加入代碼:

    image

    Ctrl + 1 。并改之。

    image

    測試失敗。加入字段。并改get方法和構造函數。

    image

    增加測試用例

    image

     

    length方法中的6是怎么來的?

    6表示:傳入3個元素,就有六種排列方式。再看看Arrangement類的職責?Arrangement表示的應該是一個排列,而對于全排列來說,需要一個新的類來表示,取名為:AllArrangement。

    所以修改測試,修改length方法。length方法返回的就是,elements.length。

     

    還需要Arrangement類實現什么功能?暫時還不清楚,這最好問AllArrangement類。編寫AllArrangement類的測試。

    注意:當時為了方便,把測試類命名為TestArrange,現重命名為:TestArrangement。

     

    AllArrangement

    編寫測試

    image

    生成Stob類和方法

    image

    測試通過。

     

    注意:Arrangement類型,由于沒使用泛型,編譯器出現了警告。Ctrl + 1 變為Arrangement<?>,

    Arrangement和Arrangement<?>有什么區別?

    如果Arrangement類存在下面的方法:

    public set(int index, E element) {...}

    如果參數是Arrangement,就可以調用這個方法,如果是Arrangement<?>就不能調用。因為element的類型為?,無法把一個對象傳給?類型的參數

    這個方法中,不需要更改Arrangement中的元素,取Arrangement<?>類型作為arrangement的參數,剛好。

     

    任務列表:

    • 如何求得全排列的元素個數?
    • AllArrange應該實現Iterable接口。

     

    如何求得全排列的元素個數?

    6=3!只要有個求階乘的函數,就可以了。因為對求階乘的方法,我很熟悉,我認為我不會寫錯,就沒寫測試了。

    image

     

    AllArrange應該實現Iterable接口。

    寫測試。

    Arrangement的判等

    image

    image

    增加toString方法。toString只是用來更加直觀的顯示,沒必要測試。

    image

    image

    元素順序沒有錯。增加equals方法。

    image

    判等要考慮的有兩個:

    • 與null對象判等
    • 與非同類對象判等

     

    再回到TestAllArrangement類。用字典順序法去迭代排列。

    • hasNext == Arrangement.isNotMax
    • next = Arrangement.next

    hasNext

    排列 54321(12345 五個元素的排列)是最大。

    測試

    image

    這里用到了自動裝箱。

    image

    image

    改變了類型參數。

    增加測試用例

    image

     

    next

    image

    21354的下一個是21435

    步驟:

    1. 找到5。從右往左,第一個大值
    2. 找到4。從5開始往右,大于3的最小數
    3. 交換3和4. 變成:21453
    4. 把4右邊的元素排序。

     

    找到5

    image

    image

    isMax方法和lastTop方法很相似,更改isMax。

    image

     

    找到4

    image

    image

    交換34

    image

    這里又用了一個新的類型變量T。由于這么簡單的函數,就不寫測試了。

    排序,用Arrays.sort簡單解決。

     

    next

    測試

    image

    image

    保證原Arrangement不變

     

    TestAllArrangement

    image

     

    image

    image

    還有:

    • Arrangement的個數不能太多
    • Arrangement中的元素不能重復
    • AllArrangement中的迭代器iterator應該用Singleton(單例)模式
    • 迭代器next方法返回的是Arrangement<?>
    • remove方法

     

    代碼缺少的還有注釋。

    最終的源代碼下載地址:http://m.tkk7.com/Files/jeff-lau/arrangement.zip

    posted on 2008-01-03 01:58 Jeff Lau 閱讀(1862) 評論(0)  編輯  收藏 所屬分類: Jeff On Java 2008

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 337p日本欧洲亚洲大胆裸体艺术| 亚洲AV永久纯肉无码精品动漫| 免费真实播放国产乱子伦| 国产乱辈通伦影片在线播放亚洲| 久久亚洲精品中文字幕| 亚洲大码熟女在线观看| 免费无码一区二区三区| 亚洲 另类 无码 在线| 亚洲综合久久1区2区3区| h视频免费高清在线观看| 9久9久女女免费精品视频在线观看| 在线亚洲精品自拍| 天黑黑影院在线观看视频高清免费| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 亚洲高清免费视频| 亚洲欧洲精品一区二区三区| 亚洲精品国产suv一区88| 在线免费观看视频你懂的| 亚洲精品福利网站| 免费无码精品黄AV电影| 久久99国产亚洲精品观看| 无码精品人妻一区二区三区免费| 国产成人A在线观看视频免费 | 亚洲精品自偷自拍无码| 99爱在线精品免费观看| 久久精品国产精品亚洲色婷婷| 无码av免费网站| 国产亚洲成av人片在线观看| 美女免费精品高清毛片在线视| 91黑丝国产线观看免费| 亚洲第一第二第三第四第五第六| 亚洲一区二区三区乱码A| 黄床大片30分钟免费看| 亚洲真人无码永久在线| 四虎永久在线精品免费一区二区| 亚洲精品无码乱码成人| 国产精品入口麻豆免费观看| 羞羞视频免费观看| 亚洲综合自拍成人| 国产成人精品高清免费| 国产亚洲蜜芽精品久久|