java.util包中的LinkedListjava
遍歷:遍歷鏈表,利用迭代器。鏈表對象可使用iterator()方法獲取一個Iterator對象,該對象就是針對當前鏈表的迭代器。git
List<Student> list = new LinkedList<Student>();算法
list.add(new Student(編程
list.remove("數據結構
int binarySearch(List數據結構和算法
public static sort(Listide
list.add("測試
在數據結構和算法中,排序是很重要的操做,要讓一個類能夠進行排序,有兩種方法:this
針對下面的Student類,使用Comparator編程完成如下功能:spa
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
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()); //下面方錐體積和上面計算圓錐體積的道理相同 } }
比較了使用迭代器遍歷鏈表和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 + "毫秒"); } }
代碼中使用了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()方法在前面解釋過了 } } }
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 + "身高相同"); } } }
代碼中使用了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()); } } }
代碼中用堆棧輸出該遞歸序列的若干項 。
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++;//實現遞歸循環 } } } }
這是一個英語單詞查詢的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("沒有此單詞"); } } }
代碼中的樹集按着英語成績從底到高存放四個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); //依次輸出排序好的結點 } } }
使用了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); } //按照英語成績排序和按照數學成績排序相似,只是更換了關鍵字 } }
代碼中使用了自動裝箱與拆箱。
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); } } }
代碼中使用對象流實現商品庫存的錄入與顯系示統。 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,"顯示"); } } }
1.使用堆棧結構輸出an的若干項,其中an=2an-1+2an-2,a1=3,a2=8。
2.編寫一個程序,將鏈表中的學生英語成績單存放到一個樹集中,使得按成績自動排序,並輸出排序結果。
3.有10個U盤,有兩個重要的屬性:價格和容量。編寫一個應用程序,使用TreeMap<K,V>類,分別按照價格和容量排序輸出10個U盤的詳細信息。
https://gitee.com/BESTI-IS-JAVA-2018/20165305zhenlong/blob/master/java/XiTi/XiTi1.java
https://gitee.com/BESTI-IS-JAVA-2018/20165305zhenlong/blob/master/java/XiTi/XiTi2.java
https://gitee.com/BESTI-IS-JAVA-2018/20165305zhenlong/blob/master/java/XiTi/XiTi3.java