Debug到死系列,感覺每一個方法都查了了好幾遍。。。感覺完成project1之后對List和Array的理解加深了不少,而且debug的能力明顯增強23333 。
代碼很多寫的也比較繁瑣就不貼了,挑幾個寫的少的貼上吧,debug到最后自己經常都搞暈了,簡單說下思路
part1: 設置了一個pixel的private class其中包含Red,Green,Yellow三個顏色的值,然后建立一個pixel的矩陣,就是基本的數據結構了。
Blur和Sobel方法:最好將原矩陣外擴一圈0,便於簡化代碼,還是注意擴大后矩陣width和height分別為width+2和height+2而不是+1(看組長的博客才意識到這點),
其余的就是多次用loop和recur改動矩陣的元素就好,細心一些避免出現OutOfBoundException。
測試結果:
part2-4:
其實並沒有搞明白part2最開始讓建立的那兩個構造函數是干什么用的,感覺只需要part3那個構造函數就行了啊。
Run的構建是采用DoubleList(有一個head和tail),不過感覺用circularList(就是只有一個sentinel對象作為頭和尾)更簡化一些,List的node存放一個三個short值分別存放red,green和blue,還有一個int值(名字為num)用來表示其中包含重復pixel的個數。
part3:我是將自己的DoubleList的insert方法做了點改動,就是在insert進一個pixel的時候判斷下是否和當前隊尾(tail)元素的顏色值相同,若相同則tail的num加一並不增加node,若不同則新增一個num為1的node,這樣就能保證list里面無重復元素。
1 void insert(DListNode d){ 2 if(size==0){ 3 head=new DListNode(d); 4 tail=head; 5 size=1; 6 } 7 else{ 8 if(d.red==tail.red&&d.green==tail.green&&d.blue==tail.blue){ 9 tail.num++; 10 } 11 else{18 DListNode node=new DListNode(d); 19 tail.next=node; 20 node.prev=tail; 21 tail=node; 22 size++; 23 }24 } 25 } 26 public RunLengthEncoding(PixImage image) { 27 this.width=image.getWidth(); 28 this.height=image.getHeight(); 29 for(int j=0;j<image.getHeight();j++){ 30 for(int i=0;i<image.getWidth();i++){ 31 DListNode node=new DListNode(image.getRed(i, j),image.getGreen(i, j),image.getBlue(i, j),1); 32 list.insert(node); 33 }
part2(c)可以利用part2(b)產生的Runiterator遍歷List,code(最開始直接remove List的首元素,后來發現把list中的node全remove走了導致part4沒法實現了。。。):
public PixImage toPixImage() { PixImage image=new PixImage(this.width,this.height); int i=0; int j=0; RunIterator runiterator=iterator(); while(runiterator.hasNext()){ int[]a=runiterator.next(); DListNode node=new DListNode(a[0],a[1],a[2],a[3]); for(int k=0;k<node.num;k++){ image.setPixel(i, j, node.red, node.green, node.blue); if(i<this.width-1){ i++; }else{ i=0; j++; } } } return image; }
part4:
part4感覺很麻煩,主要是得考慮很多種情況,我考慮的大致是是否是首尾元素,該node的num是否為一,如果不為一是在node中的首還是尾還是中間,然后再檢查和前面的node是否一致,檢查和后面的node是否一致。。。好麻煩的感覺:
后來想到個偷懶點的辦法,就是可以先不管和前后重復不重復先插入一個新的node,最后再統一調整一遍,code:
public void prevcheck(){ DListNode node=list.head; while(node.next!=null){ if(node.red==node.next.red&&node.green==node.next.green&&node.blue==node.next.blue){ node.num++; node.next.next.prev=node; node.next=node.next.next; } node=node.next; } }
不過即便這樣還是得判斷插入node的位置,所以前面的分類還是避免不了要考慮到很多種情況(num是否為一?若不為一位於node中具體哪個位置(首位,中間,末位?)還有是否為head或tail。。),如果哪位大佬有更簡單的辦法跟麻煩告訴我一聲,我感覺這個代碼寫的特別長。。。
運行結果: