學號 2018-2019-20172309 《程序設計與數據結構(下)》第四周學習總結

第六章學習內容總結(列表)

教材學習內容總結

  • 6.1鏈表集合:
    • 列表集合是一種概念性表示法,使事物以線性列表的方式進行組織。
    • 鏈表集合沒有內在的容量大小,他能夠隨須要而增大。
    • 鏈表結合分爲:
  1. 有序列表:按照其元素內在的特性進行排序。//有序列表中的元素具備內在關聯,這種關聯定義了元素之間的順序。
  2. 無序列表:其元素之間不具備內在的順序,順序爲加入時的順序。//無序列表的元素按照使用者所選擇的方法排序。
  3. 索引列表: 元素用數字索引來引用。 //索引列表爲他的元素維護一段連續的數字索引值。
  • 6.2 java集合API中的列表
    • list接口中的一些方法:
  • 6.3 使用無序列表:學習計劃
    • 代碼:
  1. course類
  2. ProgramOfStudy
  3. POSTester類
    • 運行結果:
  • 6.4索引列表使用實例:JosephUS問題
    • 代碼:
    • 運行結果:
  • 6.5列表ADT
    • 代碼:
  1. ListADt
  2. OrderedListADT
  3. UnOrderedListADT

課本學習遇到的問題

  • 問題一:課本P97頁,串行化?
  • 解答:爲了理解串行化,咱們將從三個方面來理解它:是什麼,怎麼用,注意什麼。
  1. (前序)Serializable(用於串行化)接口中沒有任何的方法。當一個類聲明要實現Serializable接口時,只是代表該類參加串行化協議,而不須要實現任何特殊的方法。
  2. 什麼是串行化?
    對象的壽命一般隨着生成該對象的程序的終止而終止。有時候,可能須要將對象的狀態保存下來,在須要時再將對象恢復。咱們把對象的這種能記錄本身的狀態以便未來再生的能力。叫做對象的持續性。對象經過寫出描述本身狀態的數值來記錄本身 ,這個過程叫對象的串行化
  3. 怎麼串行化?
    1. 首先定義了一個類,實現了Serializable接口//課本中是course類實現了Serializable接口。
    2. 構造對象的輸入/輸出流//將對象的狀態寫入文件,再次打開再讀取文件。
      總的來講就是爲了記錄一個東西的原來的狀態,先把它記錄下來並寫到文件,最後讀取就好了。
  4. 注意事項:
    1. 串行化只能保存對象的非靜態成員交量,不能保存任何的成員方法和靜態的成員變量,並且串行化保存的只是變量的值,對於變量的任何修飾符都不能保存。
    2. 這樣不是很安全,有可能有些private類型的數據被保留下來。
  • 問題二:
int targetIndex = list.indexOf(target);//此中的list.indexOf()方法是幹嗎的?
        if (targetIndex != -1)
            list.set(targetIndex, newCourse);
  • 解答:此方法是javaAPI 中 java.util.List接口中的方法,做用是查到傳入元素的索引,沒有則返回-1.html

  • 問題三:這個東西是個啥玩意兒?
public Iterator<Course> iterator()
    {
        return list.iterator();
    }
  • 解答:爲了獲得一個對象,用於集合內部的遍歷。

敲代碼中出現的錯誤

  • 問題一:在書上Josephus例子中,出現了小錯誤:

    數字出來的順序應該是:3 6 2 7 5 1 4
  • 這個應該是每數三個數就刪去一個,因此應該隔兩個數,刪一個。作法是:targetIndex = skip;targetIndex = (targetIndex + skip) % list.size();改爲targetIndex = skip-1;targetIndex = (targetIndex + skip-1) % list.size();
  • 問題二:在寫LinkedOrderedList類出現問題:

代碼如圖:java

public void add(T element)
    {
        if (!(element instanceof Comparable))
            throw new NonComparableElementException("OrderedList");

        Comparable<T> comparableElement = (Comparable<T>)element;
        LinearNode<T> list=new LinearNode<T>(element);

         if(head==null) {//此處有錯,請特別注意!
             list.setNext(head);
             head =tail= list;
         }

         else {
             LinearNode<T> current = null,current1 = head;
             while (current1.getNext() != null && comparableElement.compareTo(current1.getElement()) > 0)
             {
                 current = current1;
                 current1=current1.getNext();

             }
                 if(current1.getNext()==null)
                 {
                     tail.setNext(list);
                    tail=list;
                 }
                 else//此處有錯,請特別注意!這是引發報錯的地方
                 {
                     current.setNext(list);
                     list.setNext(current1);
                 }
         }

    }
}
  • 解決方法:正確代碼
public void add(T element) {
        if (!(element instanceof Comparable))
            throw new NonComparableElementException("OrderedList");

        Comparable<T> comparableElement = (Comparable<T>)element;
        second_term.second_week.LinearNode<T> temp = new second_term.second_week.LinearNode<T>(element);
        if (count==0) {
            head = temp;
             tail = temp;
        }
        else {
            second_term.second_week.LinearNode<T> current0=null,current1=head;
            while(current1.getNext()!=null&&comparableElement.compareTo(current1.getElement())>0){//當插入第二個元素時,current1.getNext()==null
                current0=current1;
                current1= current1.getNext();
            }
            if (current1.getNext()==null){//此時須要與第一個元素比較,有可能比第一個元素小。
                if (comparableElement.compareTo(current1.getElement())>0){
                tail.setNext(temp);
                tail =temp;}
                else{
                    temp.setNext(head);
                    tail = head;
                    head = temp;
                }
            }
            else{//此處當已經插入 5 6 時,再插入2時須要分開判斷,首先2與5比較,current0=null,current1 = head,
                if (comparableElement.compareTo(head.getElement())<0){
                    head =temp;
                    temp.setNext(current1);
                    tail = current1;
               }
                else{
                    current0.setNext(temp);//若是不分開判斷,current0位null,沒有next,因此報空指針異常
                    temp.setNext(current1);
                }
            }
        }
        count++;
    }

上週考試錯題總結

第3、四章錯題:

  • 錯題一:
    理解狀況:課本上的這張圖大概能講解:git

  • 錯題二:
  • 理解狀況:多態的定義是容許不一樣的對象對同一消息做出不一樣的響應,因此只要向不一樣對象發出同一指令就OK了。編程

  • 錯題三:
  • 理解狀況:若是一個異常沒有被捕獲,他會沿着方法調用棧向下移,直到它被捕獲,若是異常被捕獲,就不會被傳播。調用該方法的另外一個方法就不會拋出異常。數組

  • 錯題四:
    理解狀況:數組聲明時要求聲明大小,當達到數組容量時,將調用方法進行擴容。安全

  • 錯題五:
  • 理解狀況:編程語言的底層實現就是數據結構。markdown

第五章錯題:

  • 全對,沒錯題。

代碼託管

(上半年敲了7200行)
數據結構

點評模板

隊友博客中值得學習的地方:

- 隊友很會排版,並無像個人博客同樣看起來頭重腳輕的感受。
- 隊友的文字樣式豐富,值得本身學習。

本週學習狀況:

- [20172310]( http://www.cnblogs.com/Qiuxia2017/)
- 結對學習內容:
  1. 對實驗一碰見的問題進行討論。
   2. 教材第六章內容的共同窗習。
    3. 第六章代碼編寫的討論

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 260/0 1/1 05/05
第二週 300/560 1/2 13/18
第三週 212/772 1/4 21/39
第四周 330/1112 2/7 21/60

參考資料

相關文章
相關標籤/搜索