7---可变参数+Collections集合工具类+冒泡排序+Map集合
1、可變參數
1、概念:
? 是jdk1.5的新特性,應用于方法參數列表中。主要是為了解決要寫很多重載方法的情況。
? 特點:
? (1)可變參數的參數們都是相同類型的
? (2)一個方法只能有一個可變參數(方法參數列表中可以同時有可變參數和非可變參數)
? (3)可變參數需要放在方法參數列表的最后面
2、格式:
修飾符 返回值類型 方法名(數據類型... 變量名){
}
(和普通方法相比,在數據類型后面添加…即可)
3、可變參數的好處
? 是一個可變參數的反方法,可以傳入任意多個參數,就不用寫多個重載方法,簡化代碼。
4、底層原理:
? 可變參數的實際上是一個數組。(見下面代碼)
public static void main(String[] args) {// add();int x = add(1, 2, 3, 4, 5, 6);System.out.println(x);}// 定義一個可變參數的方法public static int add(int... a) {// System.out.println(a); // 輸出結果是[I@1c53fd30,是一個地址值。//從反編譯工具編譯該java文件得出:可變參數的實際上是一個數組/*反編譯結果public static void main(String args[]){int x = add(new int[] { //調用靜態方法add()1, 2, 3, 4, 5, 6});System.out.println(x);}public static transient int add(int a[])//靜態方法{int sum = 0;for (int i = 0; i < a.length; i++)sum += a[i];return sum;} */// 遍歷數組得到所有的參數int sum = 0;for (int i = 0; i < a.length; i++) {sum += a[i];}return sum;}// 1.一個方法只能有一個可變參數// public static void test01(int... a, String... b) {//報錯// }// 2.可變參數需要放在參數列表的最后面// public static void test01(int... a, String b) {//報錯// }?
2、Collection集合類的常用方法
1、概念:
? Collections是集合工具類,里面提供了很多操作集合的方法。
? 這個類沒有看到構造方法,里面的方法全是靜態方法,我們直接使用類名調用
2、常用方法
static <T> boolean addAll(Collection<?> c, T... elements) //將后面的數據添加到前面的集合中 static void shuffle(List<?> list) //隨機交換集合中的元素 static void sort(List<T> list) //根據元素的自然順序升序排? PS:第三個方法sort();若比較的是字符串,見一下代碼:
ArrayList<String> list2 = new ArrayList<>(); Collections.addAll(list2, "b","a","d","bc","bb","ca");Collections.sort(list2); //按照字母的ASCII碼值來排序,先全部按照第一個排序;多個字母的再進行比較(如果第一個相同,再比較第二個字母) System.out.println("排序后: " + list2); // 排序后: [a, b, bb, bc, ca, d]3、Comparator比較器
? Comparator是一個接口。在Collections類中的sort();重載方法中有用到,該方法通過根據指定的排序規則來對集合中的數據進行排序。
static <T> void sort(List<T> list, Comparator<? super T> c)? PS: Comparator是一個接口,它作為sort方法的參數之一。(運用多態傳入該接口的實現類對象)見以下代碼。
? 學生類
public class Student {private String name;private int age; private double socre; //構造方法 //getter setter //重寫toString() }? 重寫Comparrator接口的compare方法的類(當運用匿名內部類的時候此代碼可省略)
public class StudentComparator implements Comparator<Student> {//如果此處的接口沒有指定泛型,就會默認是Object類型@Overridepublic int compare(Student o1, Student o2) {//此處重寫Comparator接口的compare()方法// 比較學生年齡: o1 - o2升序// return o1.getAge() - o2.getAge();// 比較學生年齡: o2 - o1降序// return o2.getAge() - o1.getAge();// 按照學生成績降序return (int)(o2.getSocre() - o1.getSocre());} }? 測試類
public static void main(String[] args) {ArrayList<Student> list = new ArrayList<>();Student s1 = new Student("赤木晴子", 16, 99);Student s2 = new Student("赤木剛憲", 19, 100);Student s3 = new Student("宮城良田", 20, 59);Collections.addAll(list, s1, s2, s3);// static <T> void sort(List<T> list, Comparator<? super T> c) 根據指定的排序規則來對集合中的數據進行排序// Comparator是一個接口,方法參數要接口,我們傳入接口的實現類對象StudentComparator sc = new StudentComparator();Collections.sort(list, sc);System.out.println("方法一");for (Student student : list) {System.out.println(student);}// 方法參數要接口,我們傳入匿名內部類Collections.sort(list, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {// // 按照學生成績升序return (int)(o1.getSocre() - o2.getSocre());}});System.out.println("方法er");for (Student student : list) {System.out.println(student);}}3、冒泡排序
1、原理:
? 相鄰元素比較,大的往后放。(就像水里的泡泡往上升一樣,越往上的泡泡越大)
2、分析:
分析:第一輪:j j+1arr[0] 和 arr[1]arr[1] 和 arr[2]arr[2] 和 arr[3]第二輪:arr[0] 和 arr[1]arr[1] 和 arr[2]第三輪:arr[0] 和 arr[1]總結:(1)有i個元素比較,就要進行(i-1)輪比較(2)第一輪比較次數為i-1次,其后每經過一輪,每一輪的比較次數-1;3、代碼實現
public static void main(String[] args) {int[] arr = {5, 2, 3, 1};// 外循環控制比較輪數for (int i = 0; i < arr.length - 1; i++) { // i = 0,1,2System.out.println("輪數");// 內循環控制每輪的比較次數, j小于幾就比較幾次for (int j = 0; j < arr.length - 1 - i; j++) {// System.out.println("\t" + j + "和" + (j+1) + "比較");// 相鄰元素比較,大的往后放if (arr[j] > arr[j+1]) {// 前面大,后面小,交換位置int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}System.out.println("排序后:" + Arrays.toString(arr)); }4、Map集合
1、介紹
? (1)Map集合是與Collection集合無關的另外一種集合接口。
? (2)Map集合是存放一種表示映射關系的對象的集合,這種關系是一一對應得。
? (3)這種映射關系為“鍵”映射到“值”的對象。
? a. Map不能包含重復的鍵,但是值可以重復
? b.每個鍵可以映射到最多一個值
總結:
Map集合特點:1.保存鍵和值2.鍵不能重復,值可以重復3.一個鍵對應一個值2、Map的常用方法
? Map是一個集合,常用的方法就是增刪改查
增&改 V put(K key, V value)當鍵不重復是添加鍵值對,返回null,當鍵存在是修改,返回被修改的數據
 查 V get(Object key) 通過鍵獲取值
 **刪 **V remove(Object key) 通過鍵刪除這個鍵值對
 查集合大小 int size() 獲取map的鍵值對的個數
補充:boolean containsKey(String key) 判斷map中是否包含指定的鍵,如果包含返回true
public static void main(String[] args) {HashMap<String, String> map = new HashMap<>();// V put(K key, V value) 當鍵不重復是添加鍵值對,返回null,當鍵存在是修改,返回被修改的數據map.put("鄧超", "孫儷");map.put("黃曉明", "楊穎");System.out.println(map.put("謝霆鋒", "張柏芝")); //鍵不重復,put方法返回 nullmap.put("老干爹", "老干媽");System.out.println(map.put("謝霆鋒", "王菲")); // 鍵重復,put方法返回 張柏芝(被修改)System.out.println(map);// V get(Object key) 通過鍵獲取值System.out.println(map.get("老干爹")); // 老干媽// V remove(Object key) 通過鍵刪除這個鍵值對map.remove("老干爹");System.out.println("刪除后: " + map);// int size() 獲取map的鍵值對的個數System.out.println(map.size()); }3、Map的實現類HashMap:
? hashMap的底層是哈希表
? 構造格式:
HashMap<K, V> map = new HashMap<>();
? PS:(K(Key)表示鍵的數據類型,V(Value)表示值的數據類型)
1、遍歷
? Map遍歷就是依次取出每個鍵和值(一次獲取一對)
(1)鍵找值方式步驟:
? 1.獲取所有的鍵------------->Set keySet(): 返回map中所有的鍵,存放到Set集合中
 ? 2.遍歷獲取每個鍵----------> for循環
 ? 3.通過鍵找值-----------------> V value = map.get(key)
? 代碼實現
public static void main(String[] args) {HashMap<String, String> map = new HashMap<>();map.put("鄧超", "孫儷");map.put("黃曉明", "楊穎");map.put("謝霆鋒", "張柏芝");map.put("老干爹", "老干媽");// 1.獲取所有的鍵Set<String> keySet = map.keySet();// 2.遍歷獲取每個鍵for (String key : keySet) {// 3.通過鍵找值String value = map.get(key); // 核心,通過鍵找到值System.out.println(key + ":::" + value);} }(2)遍歷Entry方式
? 1、Entry概念
? Entry是Map接口內部的一個接口,表示鍵值對對象,里面會保存鍵和值,Entry相當于結婚證。
? 2、如何獲取entry
? Set<Map.Entry<K,V>> set集合名字 = hashMap名字.entrySet(): 獲取所有的Entry
? 注意:(1)Map接口中沒有獲取一個Entry的方法,只能獲取所有Entry)
? (2)其中,Map.Entry<K,V>表示鍵值對類型;entrySet()是Map接口中返回Set集合(該集合的元素類型為鍵值對類型)的一個成員方法。
? 3、步驟:
? 1.得到所有的Entry-----------> Set<Map.Entry<K,V>> set集合名字 = hashMap名字.entrySet()
 ? 2.遍歷得到每個Entry
 ? 3.通過Entry得到鍵和值----------->Entry名.getKey()得到鍵;Entry名.getValue()得到值
2、HashMap存儲自定義類型
? 也就是保證hashMap集合的元素種的鍵不重復。又因為hashSet的底層是哈希表,所以要保證鍵不重復,則需要重寫鍵的hashCode和equals方法
? 應用舉例:
? 需求:每位學生(姓名,年齡)都有自己的家庭住址。那么,既然有對應關系,則將學生對象和家庭住址存儲到map集合中。學生作為鍵, 家庭住址作為值。
?
? 學生類
public class Student {private String name;private int age;//構造方法 //getter setter //重寫toString()//需要重寫鍵的hashCode和equals方法@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;if (age != student.age) return false;return name != null ? name.equals(student.name) : student.name == null;}@Overridepublic int hashCode() {int result = name != null ? name.hashCode() : 0;result = 31 * result + age;return result;} public static void main(String[] args) {// 1.定義學生類// 2.創建一個Map用于存放學生HashMap<Student, String> map = new HashMap<>();// 3.創建4個學生存儲到Map中Student s1 = new Student("流川楓", 18);Student s2 = new Student("櫻木花道", 17);Student s3 = new Student("赤木晴子", 16);Student s4 = new Student("三井壽", 19);Student s5 = new Student("三井壽", 19);map.put(s1, "北海道");map.put(s2, "東京");map.put(s3, "大版");map.put(s4, "名古屋");map.put(s5, "廣島");// 4.遍歷map// 1.鍵找值方式Set<Student> keySet = map.keySet();for (Student key : keySet) {String value = map.get(key);System.out.println(key + " == " + value);}System.out.println("-------------");// 2.Entry方式Set<Map.Entry<Student, String>> entrySet = map.entrySet();for (Map.Entry<Student, String> entry : entrySet) {System.out.println(entry.getKey() + "::" + entry.getValue());} }3、HashMap的應用場景以及其常用常用方法和遍歷的綜合應用
? 當有對應關系的時候就使用map。
應用舉例:
? 需求:計算一個字符串中每個字符出現次數。
分析:一個字母會對應一個次數,有對應關系就使用Map集合來存儲,字母作為鍵,次數作為值實現步驟:1.定義一個字符串2.創建一個Map,字母作為鍵,次數作為值3.遍歷字符串,得到每個字母4.如果map中沒有這個字母,次數設置為1次5.如果map中有這個字母,次數+16.遍歷map集合 public static void main(String[] args) {// 1.定義一個字符串String str = "bzcbzaabAaacb";// 2.創建一個Map,字母作為鍵,次數作為值HashMap<Character, Integer> map = new HashMap<>();// 3.遍歷字符串,得到每個字母for (int i = 0; i < str.length(); i++) {// 通過索引得到字符char c = str.charAt(i);// Map方法: boolean containsKey(Object key) 判斷map是否有這個鍵if (map.containsKey(c)) {// 5.如果map中有這個字母,次數+1// 通過鍵找值,得到字符c之前已有的次數int cout = map.get(c);// 次數+1map.put(c, cout + 1);} else {// 4.如果map中沒有這個字母,次數設置為1次map.put(c, 1);}}// 6.遍歷map集合// Entry方式Set<Map.Entry<Character, Integer>> entrySet = map.entrySet();for (Map.Entry<Character, Integer> entry : entrySet) {System.out.println(entry.getKey() + ": " + entry.getValue());} }4、圖書館管理系統
/* 功能分析:1.功能選擇界面2.初始化書籍3.查看書籍4.添加書籍5.刪除書籍6.修改書籍目標:實現 1.功能選擇界面打印輸出相應字符串即可使用鍵盤輸入根據用戶的輸入進行選擇目標:實現 2.初始化書籍1.定義Book書籍類2.創建一個名著集合,存儲兩本名著3.創建一個it書籍集合,存儲兩本it書籍4.創建一個Map,鍵是書籍類型,值就是對應的書籍集合5.添加對應的數據到Map集合中目標:實現 3.查看書籍遍歷map集合目標:實現 4.添加書籍輸入要添加書籍的類型輸入要添加的書名輸入要添加書的價格創建Book對象添加到對應的ArrayList集合中目標: 實現 5.刪除書籍輸入要刪除書籍的類型輸入要刪除的書名通過類型找到書籍的集合從集合中刪除這本數目標: 實現 6.修改書籍輸入要修改書籍的類型輸入要修改書籍的書名輸入新的書名輸入新的價格通過類型找到書籍的集合遍歷書籍集合找到要修改的書籍修改書籍*/ public static void main(String[] args) {// 2.初始化書籍// 1.定義Book書籍類// 2.創建一個名著集合,存儲兩本名著ArrayList<Book> mz = new ArrayList<>();mz.add(new Book("西游記", 19));mz.add(new Book("水滸傳", 29));// 3.創建一個it書籍集合,存儲兩本it書籍ArrayList<Book> it = new ArrayList<>();it.add(new Book("Java入門到精通", 99));it.add(new Book("PHP入門到精通", 9.9));// 4.創建一個Map,鍵是書籍類型,值就是對應的書籍集合HashMap<String, ArrayList<Book>> map = new HashMap<>();// 5.添加對應的數據到Map集合中map.put("名著", mz);map.put("it書籍", it);// 讓功能選擇界面可以循環多次選擇while (true) {// 1.功能選擇界面, 打印輸出相應字符串即可System.out.println("--------歡迎來到圖書管理系統--------");System.out.println("1.查看書籍");System.out.println("2.添加書籍");System.out.println("3.刪除書籍");System.out.println("4.修改書籍");System.out.println("5.退出");// 使用鍵盤輸入Scanner sc = new Scanner(System.in);System.out.println("請輸入你的選擇:");int operator = sc.nextInt();// 根據用戶的輸入進行選擇switch (operator) {case 1:showAllBooks(map);break;case 2:addBook(map);break;case 3:deleteBook(map);break;case 4:updateBook(map);break;case 5:System.out.println("大爺,請慢走,歡迎下次再來!");System.exit(0);break;default:System.out.println("大爺,你的操作不存在.請不要亂來");break;}} }private static void updateBook(HashMap<String, ArrayList<Book>> map) {// 目標: 實現 6.修改書籍Scanner sc = new Scanner(System.in);// 輸入要修改書籍的類型System.out.println("請輸入要修改書籍的類型");String type = sc.next();// 輸入要修改書籍的書名System.out.println("請輸入要修改書籍的書名");String oldName = sc.next();// 輸入新的書名System.out.println("請輸入新的書名");String newName = sc.next();// 輸入新的價格System.out.println("請輸入新的價格");double newPrice = sc.nextDouble();// 通過類型找到書籍的集合ArrayList<Book> list = map.get(type);if (list == null) {System.out.println("要修改的書籍類型不存在");return;}// 遍歷書籍集合找到要修改的書籍for (int i = 0; i < list.size(); i++) {Book book = list.get(i);if (book.getName().equals(oldName)) {// 找到了要修改的書籍// 修改書籍book.setName(newName);book.setPrice(newPrice);System.out.println("修改" + oldName + "成功");return;}}System.out.println("沒有找要修改的書籍" + oldName); }private static void deleteBook(HashMap<String, ArrayList<Book>> map) {// 目標: 實現 5.刪除書籍Scanner sc = new Scanner(System.in);// 輸入要刪除書籍的類型System.out.println("請輸入要刪除書籍的類型");String type = sc.next();// 輸入要刪除的書名System.out.println("請輸入要刪除的書名");String name = sc.next();// 通過類型找到書籍的集合ArrayList<Book> list = map.get(type);if (list == null) {System.out.println("沒有這個類型的書籍");return;}// 從集合中刪除這本數for (int i = 0; i < list.size(); i++) {Book book = list.get(i);if (book.getName().equals(name)) {// 找到要刪除的書籍,并刪除list.remove(i);System.out.println("刪除" + name + "成功");return ; // 結束這個方法}}System.out.println("沒有這本書籍" + name); }private static void addBook(HashMap<String, ArrayList<Book>> map) {// 目標:實現 4.添加書籍Scanner sc = new Scanner(System.in);// 輸入要添加書籍的類型System.out.println("請輸入要添加書籍的類型");String type = sc.next();// 輸入要添加的書名System.out.println("請輸入要添加的書名");String name = sc.next();// 輸入要添加書的價格System.out.println("請輸入要添加書的價格");double price = sc.nextDouble();// 創建Book對象Book book = new Book(name, price);// 通過書籍類型,【找到】書籍集合ArrayList<Book> list = map.get(type);// 如果list為null說明,沒有這種類型的書籍if (list == null) {list = new ArrayList<>();map.put(type, list);}// 判斷書籍是否存在// 做一個標記,表示這本書是否存在,false表示不存在boolean exists = false;for (Book b : list) {if (b.getName().equals(name)) {// 書名相同;exists = true;break; // 一旦書名相同,就是重復的書籍,不需要往后面判斷啦}}if (exists) {// 如果存在,就不添加System.out.println(name + "書籍已經存在");} else {// 如果不存在,就添加// 添加到對應的ArrayList集合中list.add(book);System.out.println("添加" + name + "書籍成功");} }private static void showAllBooks(HashMap<String, ArrayList<Book>> map) {System.out.println("類型\t\t書名\t價格");// 遍歷Map,使用Entry方式// 1.得到所有的EntrySet<Map.Entry<String, ArrayList<Book>>> entrySet = map.entrySet();// 2.遍歷得到每個Entryfor (Map.Entry<String, ArrayList<Book>> entry : entrySet) {// 打印鍵System.out.println(entry.getKey());// 得到值(ArrayList集合)ArrayList<Book> value = entry.getValue();// 遍歷打印ArrayListfor (Book book : value) {System.out.println("\t\t\t" +book.getName() + "\t" + book.getPrice());}} }總結
以上是生活随笔為你收集整理的7---可变参数+Collections集合工具类+冒泡排序+Map集合的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 图书管理系统-书籍归还
- 下一篇: 第一章 工业机器视觉光源种类介绍
