cs61b project1


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。。),如果哪位大佬有更簡單的辦法跟麻煩告訴我一聲,我感覺這個代碼寫的特別長。。。

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM