20165305 第十週課下補作

知識總結

java.util包中的LinkedListjava

遍歷:遍歷鏈表,利用迭代器。鏈表對象可使用iterator()方法獲取一個Iterator對象,該對象就是針對當前鏈表的迭代器。git

建立一個空的鏈表

List<Student> list = new LinkedList<Student>();算法

向鏈表中添加新的結點

list.add(new Student(編程

刪除結點

list.remove("數據結構

查找:

int binarySearch(List數據結構和算法

將list中的元素按升序排序

public static sort(Listide

鏈表中數據的插入

list.add("測試

課上內容補作

數據結構-排序

在數據結構和算法中,排序是很重要的操做,要讓一個類能夠進行排序,有兩種方法:this

  • 有類的源代碼,針對某一成員變量排序,讓類實現Comparable接口,調用Collection.sort(List)
  • 沒有類的源代碼,或者多種排序,新建一個類,實現Comparator接口 調用Collection.sort(List, Compatator)

針對下面的Student類,使用Comparator編程完成如下功能:spa

  1. 在測試類StudentTest中新建學生列表,包括本身和學號先後各兩名學生,共5名學生,給出運行結果(排序前,排序後
  2. 對這5名同窗分別用學號和總成績進行增序排序,提交兩個Comparator的代碼
  3. 課下提交代碼到碼雲

代碼連接:

https://gitee.com/BESTI-IS-JAVA-2018/20165305zhenlong/tree/master/java/Student

結果截圖

數據結構-單鏈表

參見附件,補充MyList.java的內容,提交運行結果截圖(全屏)
課下推送代碼到碼雲
####代碼連接
https://gitee.com/BESTI-IS-JAVA-2018/20165305zhenlong/tree/master/java/MyList

結果截圖

第十五章的代碼分析

例子1

Example15_1.java ,Cone.java , Rect.java , Circle.java 中,聲明瞭一個泛型類:Cone,一個Cone對象計算體積時,只關心它的底是否能計算面積,並不關心底的類型
Cone.java

public class Cone<E> {            
    double height;                              
    E bottom;    //用泛型類E聲明對象bottom              
    public Cone(E b) {  //參數b是泛型類型                  
        bottom = b;               
    }                                                             
    public void setHeight(double h) { //此方法給高height賦值         
        height = h;           
    }                                                        
    public double computerVolume() {  //計算體積的方法                                    
        String s = bottom.toString();//泛型變量只能調用從Object類繼承的或重寫的方法        
        double area = Double.parseDouble(s); //將string類型轉換成double型              
        return 1.0 / 3.0 * area * height;  //計算體積                  
    }          
}

Rect.java

public class Rect {  //計算方形面積的類             
    double sideA, sideB, area;                                         
    Rect(double a, double b) { //構造方法將a,b值傳給sideA,sideB         
        sideA = a;      
        sideB = b;            
    }                                                                                                       
    public String toString() {//泛型類中的泛型變量bottom只能調用Object類中的方法,Rect類重寫了toString()方法
        area = sideA * sideB; //計算面積
        return "" + area;
    }
}

Circle

public class Circle {//計算圓形面積的類
    double area, radius;
    Circle(double r) {//構造方法將r值傳給radius
        radius = r;
    }
    public String toString() { //泛型類中的泛型變量bottom只能調用Object類中的方法,Circle類重寫Object類的toString()方法
        area = radius * radius * Math.PI;//計算面積,Math.PI爲圓周率
        return "" + area;
    }
}

Example15_1.java

public class Example15_1 {
    public static void main(String args[]) {
        Circle circle = new Circle(10);
        Cone<Circle> coneOne = new Cone<Circle>(circle);//建立一個(圓)錐對象
        coneOne.setHeight(16);//調用Cone類中setHeight()方法,將高設爲16
        System.out.println(coneOne.computerVolume());//調用Cone類中computerVolume()方法,計算體積;computerVolume()方法調用Circle類中的toString()方法,計算面積
        Rect rect = new Rect(15, 23);
        Cone<Rect> coneTwo = new Cone<Rect>(rect);//建立一個(方)錐對象
        coneTwo.setHeight(98);
        System.out.println(coneTwo.computerVolume());
        //下面方錐體積和上面計算圓錐體積的道理相同
    }
}

例子2

比較了使用迭代器遍歷鏈表和get(int index)方法遍歷鏈表的所用時間

import java.util.*;
public class Example15_2 {
    public static void main(String args[]) {
        List<String> list = new LinkedList<String>();//建立鏈表list
        for (int i = 0; i <= 60096; i++) {
            list.add("speed" + i);//添加結點
        }
        Iterator<String> iter = list.iterator();//建立迭代器iter
        long starttime = System.currentTimeMillis();//獲取當前時間
        while (iter.hasNext()) {//hasNext()此方法檢查鏈表中是否還有結點
            String te = iter.next();//next()方法獲取下一個結點
        }
        long endTime = System.currentTimeMillis();//獲取遍歷完鏈表的時間
        long result = endTime - starttime;//時間差表明遍歷鏈表的時間
        System.out.println("使用迭代器遍歷集合所用時間:" + result + "毫秒");
        starttime = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {//list.size()爲鏈表結點數
            String te = list.get(i);//list.get()依次獲得鏈表中的結點數據
        }
        endTime = System.currentTimeMillis();
        result = endTime - starttime;
        System.out.println("使用get方法遍歷集合所用時間:" + result + "毫秒");
    }
}

例子3

代碼中使用了JDK1.5版本以前的LinkedList。

import java.util.*;

public class Example15_3 {
    public static void main(String args[]) {
        LinkedList mylist = new LinkedList();//建立鏈表對象
        mylist.add("你");                 //鏈表中的第一個節點
        mylist.add("好");                 //鏈表中的第二個節點
        int number = mylist.size();         //獲取鏈表的長度
        for (int i = 0; i < number; i++) {
            String temp = (String) mylist.get(i); //必須強制轉換取出的數據
            System.out.println("第" + i + "節點中的數據:" + temp);
        }
        Iterator iter = mylist.iterator();
        while (iter.hasNext()) {
            String te = (String) iter.next();  //必須強制轉換取出的數據
            System.out.println(te);
            //hasNext()方法和next()方法在前面解釋過了
        }
    }
}

例子4

Student類經過實現Comparable接口規定該類的對象的大小關係(按height值的大小肯定大小關係,即學生按其身高肯定之間的大小關係)。鏈表添加了3個Student對象,Collections調用sort方法將鏈表中的對象按身其height值升序排序,並查找一個對象的height值是否和鏈表中某個對象的height值相同。

import java.util.*;
class Student implements Comparable {//Student類經過實現Comparable接口規定該類的對象的大小關係
int height = 0;
String name;
Student(String n, int h) {
    name = n;
    height = h;

}
public int compareTo(Object b) { // 兩個Student對象相等當且僅當兩者的height值相等
    Student st = (Student) b;
    return (this.height - st.height);
}
}
public class Example15_4 {
public static void main(String args[]) {
    List<Student> list = new LinkedList<Student>();//建立鏈表list
    list.add(new Student("張三", 188));
    list.add(new Student("李四", 178));
    list.add(new Student("週五", 198));//向鏈表中添加3個Student對象
    Iterator<Student> iter = list.iterator();//建立迭代器
    System.out.println("排序前,鏈表中的數據");
    while (iter.hasNext()) {
        Student stu = iter.next();//建立Student對象stu存放結點的數據
        System.out.println(stu.name + "身高:" + stu.height);//調用成員變量
    }
    Collections.sort(list);//Collections類提供用於排序和查找的方法
    System.out.println("排序後,鏈表中的數據");
    iter = list.iterator();//再次建立迭代器
    while (iter.hasNext()) {
        Student stu = iter.next();
        System.out.println(stu.name + "身高:" + stu.height);
    }
    Student zhaoLin = new Student("zhao xiao lin", 178);
    int index = Collections.binarySearch(list, zhaoLin, null);//查找
    if (index >= 0) {//沒有找到index=-1,找到index>=0
        System.out.println(zhaoLin.name + "和鏈表中" + list.get(index).name + "身高相同");
    }
}
}
例子5

代碼中使用了shuffle()方法、reverse()方法和rotate()。

import java.util.*;
public class Example15_5 {
    public static void main(String args[]) {
        List<Integer> list = new LinkedList<Integer>();//建立鏈表
        for (int i = 10; i <= 50; i = i + 10)
            list.add(new Integer(i));//添加結點
        System.out.println("洗牌前,鏈表中的數據");
        Iterator<Integer> iter = list.iterator();//建立迭代器
        while (iter.hasNext()) {
            Integer n = iter.next();
            System.out.printf("%d\t", n.intValue());//輸出下一下int類型的值
        }
        Collections.shuffle(list);//從新隨機排列
        System.out.printf("\n洗牌後,鏈表中的數據\n");
        iter = list.iterator();
        while (iter.hasNext()) {
            Integer n = iter.next();
            System.out.printf("%d\t", n.intValue());
        }
        System.out.printf("\n再向右旋轉1次後,鏈表中的數據\n");
        Collections.rotate(list, 1);//向右旋轉一次
        iter = list.iterator();
        while (iter.hasNext()) {
            Integer n = iter.next();
            System.out.printf("%d\t", n.intValue());
        }
   }
}

例子6

代碼中用堆棧輸出該遞歸序列的若干項 。

import java.util.*;
public class Example15_6 {
    public static void main(String args[]) {
        Stack<Integer> stack = new Stack<Integer>();//創建一個堆棧對象
        stack.push(new Integer(1));//壓棧,第一項爲1
        stack.push(new Integer(1));//壓棧,第二項爲1
        int k = 1;
        while (k <= 10) {//實現Fibonacci整數序列的前12項
            for (int i = 1; i <= 2; i++) {
                Integer F1 = stack.pop();//取出棧頂對象
                int f1 = F1.intValue();//獲得對象的int值
                Integer F2 = stack.pop();//取出棧頂對象
                int f2 = F2.intValue();//獲得對象的int值
                Integer temp = new Integer(f1 + f2);//建立f1和f2之和的對象
                System.out.println("" + temp.toString());
                stack.push(temp);//壓棧
                stack.push(F2);//將剛纔後取出的對象壓棧
                k++;//實現遞歸循環
            }
        }
    }
}

例子7

這是一個英語單詞查詢的GUI程序,用戶在界面的的一個文本框中輸入一個英文單詞回車確認,另外一個文本框顯示英文單詞的漢語翻譯。

import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
public class WordPolice implements ActionListener {
    JTextField showText;
    HashMap<String, String> hashtable;//建立散列映射對象
    File file = new File("word.txt"); //建立文件對象
    Scanner sc = null;
    WordPolice() {
        hashtable = new HashMap<String, String>();
        try {
            sc = new Scanner(file);//使用Scanner解析word.txt中的單詞
            while (sc.hasNext()) {
                String englishWord = sc.next();
                String chineseWord = sc.next();
                //根據word.txt文件可知先是英文單詞纔是漢語
                hashtable.put(englishWord, chineseWord);
                //將英文單詞、漢語做爲鍵/值對儲存在散列映射中
            }
        } catch (Exception e) {
        }
    }
    public void setJTextField(JTextField showText) {
        this.showText = showText;
    }
    public void actionPerformed(ActionEvent e) {
        String englishWord = e.getActionCommand();
        if (hashtable.containsKey(englishWord))//如有使用englishWord這個鍵的鍵/值對 {
            String chineseWord = hashtable.get(englishWord);
            //返回使用englishWorld鍵所對應的值
            showText.setText(chineseWord);
            //將值輸出
        } else {
            showText.setText("沒有此單詞");
        }
    }
}

例子8

代碼中的樹集按着英語成績從底到高存放四個Student對象。

import java.util.*;
class Student implements Comparable {
//Student類經過實現Comparable接口規定按english肯定大小關係
    int english = 0;
    String name;
    Student(int english, String name) {
        this.name = name;
        this.english = english;
    }
    public int compareTo(Object b) {
        Student st = (Student) b;
        return (this.english - st.english);
    }
}
public class Example15_8 {
    public static void main(String args[]) {
        TreeSet<Student> mytree = new TreeSet<Student>();
        //建立樹集對象
        Student st1, st2, st3, st4;
        st1 = new Student(90, "趙一");
        st2 = new Student(66, "錢二");
        st3 = new Student(86, "孫三");
        st4 = new Student(76, "李四");
        mytree.add(st1);
        //以上幾句代碼能夠簡寫爲mytree.add(new Student(90,"趙一"));
        mytree.add(st2);
        mytree.add(st3);
        mytree.add(st4);
        Iterator<Student> te = mytree.iterator();//建立迭代器
        while (te.hasNext()) {
            Student stu = te.next();
            System.out.println("" + stu.name + " " + stu.english);
            //依次輸出排序好的結點
        }
    }
}

例子9

使用了TreeMap,分別按着學生的英語成績和數學成績排序節點。

import java.util.*;
class StudentKey implements Comparable {
    //StudentKey類經過實現Comparable接口規定按關鍵字進行排序
    double d = 0;
    StudentKey(double d) {
        this.d = d;
    }
    public int compareTo(Object b) {
        StudentKey st = (StudentKey) b;
        if ((this.d - st.d) == 0)
            return -1;
        else
            return (int) ((this.d - st.d) * 1000);
    }
}
class Student {
    String name = null;
    double math, english;
    Student(String s, double m, double e) {
        name = s;
        math = m;
        english = e;
    }
}
public class Example15_9 {
    public static void main(String args[]) {
        TreeMap<StudentKey, Student> treemap = new TreeMap<StudentKey, Student>();
        //建立一個樹映射,StudentKey爲關鍵字,Student爲數值
        String str[] = {"趙一", "錢二", "孫三", "李四"};
        double math[] = {89, 45, 78, 76};
        double english[] = {67, 66, 90, 56};
        Student student[] = new Student[4];
        for (int k = 0; k < student.length; k++) {
            student[k] = new Student(str[k], math[k], english[k]);
        }
        StudentKey key[] = new StudentKey[4];
        for (int k = 0; k < key.length; k++) {
            key[k] = new StudentKey(student[k].math); //關鍵字按數學成績排列大小
        }
        for (int k = 0; k < student.length; k++) {
            treemap.put(key[k], student[k]);//向樹映射中添加鍵/值對
        }
        int number = treemap.size();//返回樹映射中的鍵/值對個數
        System.out.println("樹映射中有" + number + "個對象,按數學成績排序:");
        Collection<Student> collection = treemap.values();
        Iterator<Student> iter = collection.iterator();//建立迭代器
        while (iter.hasNext()) {
            Student stu = iter.next();
            System.out.println("姓名 " + stu.name + " 數學 " + stu.math);
        }
        treemap.clear();//清空樹映射,爲下一輪排序進行準備
        for (int k = 0; k < key.length; k++) {
            key[k] = new StudentKey(student[k].english);//關鍵字按英語成績排列大小
        }
        for (int k = 0; k < student.length; k++) {
            treemap.put(key[k], student[k]);
        }
        number = treemap.size();
        System.out.println("樹映射中有" + number + "個對象:按英語成績排序:");
        collection = treemap.values();
        iter = collection.iterator();
        while (iter.hasNext()) {
            Student stu = (Student) iter.next();
            System.out.println("姓名 " + stu.name + " 英語 " + stu.english);
        }
        //按照英語成績排序和按照數學成績排序相似,只是更換了關鍵字
    }
}

例子10

代碼中使用了自動裝箱與拆箱。

import java.util.*;
public class Example15_10 {
    public static void main(String args[]) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(i);  //自動裝箱,實際添加到list中的是new Integer(i)。
        }
        for (int k = list.size() - 1; k >= 0; k--) {
            int m = list.get(k);  //自動拆箱,獲取Integer對象中的int型數據
            System.out.printf("%3d", m);
        }
    }
}

例子11

代碼中使用對象流實現商品庫存的錄入與顯系示統。 Example15_11.java

public class Example15_11 {
  public static void main(String args[]) {
     WindowGoods win=new WindowGoods();
     win.setTitle("商品的錄入與顯示");
  }
}

Goods.java

public class Goods implements java.io.Serializable {
   String name, mount,price;
   public void setName(String name) {
      this.name=name;
   }
   public void setMount(String mount) {
      this.mount=mount;
   }
   public void setPrice(String price) {
      this.price=price;
   }  
   public String getName() {
      return name;
   }
   public String getMount() {
      return mount;
   }
   public String getPrice() {
      return price;
   } 
}

InputArea.java

import java.io.*; 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class InputArea extends JPanel implements ActionListener {
   File f=null;                   //存放鏈表的文件
   Box baseBox ,boxV1,boxV2; 
   JTextField name,mount,price;  //爲Goods對象提供的視圖
   JButton button;               //控制器
   LinkedList<Goods> goodsList; //存放Goods對象的鏈表
   InputArea(File f) {
     this.f=f;
     goodsList=new LinkedList<Goods>();
     name=new JTextField(12);
     mount=new JTextField(12); 
     price=new JTextField(12);
     button=new JButton("錄入");
     button.addActionListener(this);
     boxV1=Box.createVerticalBox();
     boxV1.add(new JLabel("輸入名稱"));
     boxV1.add(Box.createVerticalStrut(8));
     boxV1.add(new JLabel("輸入庫存"));
     boxV1.add(Box.createVerticalStrut(8));
     boxV1.add(new JLabel("輸入單價"));
     boxV1.add(Box.createVerticalStrut(8));
     boxV1.add(new JLabel("單擊錄入"));
     boxV2=Box.createVerticalBox();
     boxV2.add(name);
     boxV2.add(Box.createVerticalStrut(8));
     boxV2.add(mount);
     boxV2.add(Box.createVerticalStrut(8));
     boxV2.add(price);
     boxV2.add(Box.createVerticalStrut(8));
     boxV2.add(button);
     baseBox=Box.createHorizontalBox();
     baseBox.add(boxV1);
     baseBox.add(Box.createHorizontalStrut(10));
     baseBox.add(boxV2);
     add(baseBox); 
   }
   public void actionPerformed(ActionEvent e) {
     if(f.exists()) {
       try{
          FileInputStream  fi=new FileInputStream(f);
          ObjectInputStream oi=new ObjectInputStream(fi);
          goodsList= (LinkedList<Goods>)oi.readObject();
          fi.close();
          oi.close();
          Goods goods=new Goods();
          goods.setName(name.getText());
          goods.setMount(mount.getText()); 
          goods.setPrice(price.getText());
          goodsList.add(goods);
          FileOutputStream fo=new FileOutputStream(f);
          ObjectOutputStream out=new ObjectOutputStream(fo);
          out.writeObject(goodsList);
          out.close();
       }
       catch(Exception ee) {}
     }
     else{
       try{ 
          f.createNewFile();
          Goods goods=new Goods();
          goods.setName(name.getText());
          goods.setMount(mount.getText()); 
          goods.setPrice(price.getText());
          goodsList.add(goods);
          FileOutputStream fo=new  FileOutputStream(f);
          ObjectOutputStream out=new ObjectOutputStream(fo);
          out.writeObject(goodsList);
          out.close();
       }
       catch(Exception ee) {}
     }
   }
}

WindowsGoods.java

import java.io.*; 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class WindowGoods extends JFrame implements ActionListener {
   File file=null;
   JMenuBar bar;
   JMenu fileMenu;
   JMenuItem 錄入,顯示;
   JTextArea show;
   InputArea inputMessage;
   JPanel pCenter;
   JTable table;
   Object 表格單元[][],列名[]={"名稱","庫存","單價"};
   CardLayout card;
   WindowGoods() {
     file=new File("庫存.txt"); //存放鏈表的文件
     錄入=new JMenuItem("錄入");
     顯示=new JMenuItem("顯示");
     bar=new JMenuBar();
     fileMenu=new JMenu("菜單選項");
     fileMenu.add(錄入);
     fileMenu.add(顯示);
     bar.add(fileMenu);
     setJMenuBar(bar);
     錄入.addActionListener(this);
     顯示.addActionListener(this);
     inputMessage=new InputArea(file); //建立錄入截面
     card=new CardLayout();
     pCenter=new JPanel();
     pCenter.setLayout(card);
     pCenter.add("錄入",inputMessage);
     add(pCenter,BorderLayout.CENTER);
     setVisible(true);
     setBounds(100,50,420,380);
     validate();
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }
   public void actionPerformed(ActionEvent e) {
      if(e.getSource()==錄入) {
        card.show(pCenter,"錄入");
      }
      else if(e.getSource()==顯示) {
        try{ 
           FileInputStream fi=new FileInputStream(file);
           ObjectInputStream oi=new  ObjectInputStream(fi);
           LinkedList<Goods> goodsList=(LinkedList<Goods>)oi.readObject();
           fi.close();
           oi.close();  
           int length=goodsList.size();
           表格單元=new Object[length][3];
           table=new JTable(表格單元,列名); 
           pCenter.removeAll(); 
           pCenter.add("錄入",inputMessage);
           pCenter.add("顯示",new JScrollPane(table)); 
           pCenter.validate();      
           Iterator<Goods> iter=goodsList.iterator();
           int i=0;
           while(iter.hasNext()) {
              Goods  商品 =iter.next();
              表格單元[i][0]= 商品.getName();
              表格單元[i][1]=商品.getMount();
              表格單元[i][2]=商品.getPrice();
              i++;
           }
           table.repaint();
        }
        catch(Exception ee){}
        card.show(pCenter,"顯示");
      }
   }
}

第十五章課後編程題

3.編程題

1.使用堆棧結構輸出an的若干項,其中an=2an-1+2an-2,a1=3,a2=8。
2.編寫一個程序,將鏈表中的學生英語成績單存放到一個樹集中,使得按成績自動排序,並輸出排序結果。
3.有10個U盤,有兩個重要的屬性:價格和容量。編寫一個應用程序,使用TreeMap<K,V>類,分別按照價格和容量排序輸出10個U盤的詳細信息。

3-1

代碼連接

https://gitee.com/BESTI-IS-JAVA-2018/20165305zhenlong/blob/master/java/XiTi/XiTi1.java

結果截圖

3-2

代碼連接

https://gitee.com/BESTI-IS-JAVA-2018/20165305zhenlong/blob/master/java/XiTi/XiTi2.java

結果截圖

3-3

代碼連接

https://gitee.com/BESTI-IS-JAVA-2018/20165305zhenlong/blob/master/java/XiTi/XiTi3.java

結果截圖

相關文章
相關標籤/搜索