一邀摆、Java 中的集合框架(上)
1腻格、Java 中的集合框架概述
JAVA集合框架體系結(jié)構(gòu):Collection與Map是兩個根接口诊赊。
Collection接口:內(nèi)部存儲的是一個個獨立的對象匹颤。包含:
- 1仅孩、List接口:序列,存儲元素排列有序且可重復印蓖。實現(xiàn)類:ArrayList辽慕,數(shù)組序列。實現(xiàn)類:LinkedList赦肃,鏈表溅蛉。
- 2、Queue接口:隊列他宛,存儲元素排列有序且可重復温艇。實現(xiàn)類:LinkedList,鏈表堕汞。
- 3勺爱、Set接口:集,存儲元素無序且不可重復讯检。實現(xiàn)類:HashSet琐鲁,哈希集。
Map接口:
-
內(nèi)部以<Key,Value>兩個對象(任意類型)為一個映射去存儲數(shù)據(jù)人灼,這一個映射就是Entry類(Map的內(nèi)部類)的實例围段。包括:實現(xiàn)類:HashMap,哈希表投放。
2奈泪、Collection 接口 & List 接口簡介
3 、學生選課--創(chuàng)建學生類和課程類
package com.imooc.collection;
/**
* 課程類
* @author Administrator
*
*/
public class Course {
public String id;
public String name;
public Course(String id, String name) {
this.id = id ;
this.name = name;
}
public Course() {
}
}
package com.imooc.collection;
import java.util.HashSet;
import java.util.Set;
/**
* 學生類
* @author Administrator
*
*/
public class Student {
public String id;
public String name;
public Set<Course> courses;
public Student(String id, String name) {
this.id = id;
this.name = name;
this.courses = new HashSet<Course>();
}
}
4灸芳、學生選課
添加課程
課程查詢
課程修改
課程刪除
package com.imooc.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* 備選課程類
* @author Administrator
*
*/
public class ListTest {
/**
* 用于存放備選課程的List
*/
public List coursesToSelect;
public ListTest() {
this.coursesToSelect = new ArrayList();
}
/**
* 用于往coursesToSelect中添加備選課程
*/
public void testAdd() {
//創(chuàng)建一個課程對象涝桅,并通過調(diào)用add方法,添加到備選課程List中
Course cr1 = new Course("1" , "數(shù)據(jù)結(jié)構(gòu)");
coursesToSelect.add(cr1);
Course temp = (Course) coursesToSelect.get(0);
System.out.println("添加了課程:" + temp.id + ":" + temp.name);
Course cr2 = new Course("2", "C語言");
coursesToSelect.add(0, cr2);
Course temp2 = (Course) coursesToSelect.get(0);
System.out.println("添加了課程:" + temp2.id + ":" + temp2.name);
coursesToSelect.add(cr1);
Course temp0 = (Course) coursesToSelect.get(2);
System.out.println("添加了課程:" + temp.id + ":" + temp.name);
//以下方法會拋出數(shù)組下標越界異常
// Course cr3 = new Course("3", "test");
// coursesToSelect.add(4, cr3);
Course[] course = {new Course("3", "離散數(shù)學"), new Course("4", "匯編語言")};
coursesToSelect.addAll(Arrays.asList(course));
Course temp3 = (Course) coursesToSelect.get(2);
Course temp4 = (Course) coursesToSelect.get(3);
System.out.println("添加了兩門課程:" + temp3.id + ":" +
temp3.name + ";" + temp4.id + ":" + temp4.name);
Course[] course2 = {new Course("5", "高等數(shù)學"), new Course("6", "大學英語")};
coursesToSelect.addAll(2, Arrays.asList(course2));
Course temp5 = (Course) coursesToSelect.get(2);
Course temp6 = (Course) coursesToSelect.get(3);
System.out.println("添加了兩門課程:" + temp5.id + ":" +
temp5.name + ";" + temp6.id + ":" + temp6.name);
}
/**
* 取得List中的元素的方法
* @param args
*/
public void testGet() {
int size = coursesToSelect.size();
System.out.println("有如下課程待選:");
for(int i= 0 ; i < size; i++) {
Course cr = (Course) coursesToSelect.get(i);
System.out.println("課程:" + cr.id + ":" + cr.name);
}
}
/**
* 通過迭代器來遍歷List
* @param args
*/
public void testIterator() {
//通過集合的iterator方法烙样,取得迭代器的實例
Iterator<Course> it = coursesToSelect.iterator();
System.out.println("有如下課程待選(通過迭代器訪問):");
while(it.hasNext()) {
Course cr = it.next();
System.out.println("課程:" + cr.id + ":" + cr.name);
}
}
/**
* 通過for each方法訪問集合元素
* @param args
*/
public void testForEach() {
System.out.println("有如下課程待選(通過for each訪問):");
for (Object obj : coursesToSelect) {
Course cr = (Course) obj;
System.out.println("課程:" + cr.id + ":" + cr.name);
}
}
/**
* 修改List中的元素
* @param args
*/
public void testModify() {
coursesToSelect.set(4, new Course("7", "毛概"));
}
/**
* 刪除List中的元素
* @param args
*/
public void testRemove() {
// Course cr = (Course) coursesToSelect.get(4);
System.out.println("即將刪除4位置和5位置上的課程冯遂!");
Course[] courses = {(Course) coursesToSelect.get(4), (Course) coursesToSelect.get(5)};
coursesToSelect.removeAll(Arrays.asList(courses));
// coursesToSelect.remove(4);
System.out.println("成功刪除課程!");
testForEach();
}
/**
* 往List中添加一些奇怪的東西
* @param args
*/
public void testType() {
System.out.println("能否往List中添加一些奇怪的東西呢Z嘶瘛蛤肌?");
coursesToSelect.add("我不是課程壁却,我只是一個無辜的字符串!裸准!");
}
public static void main( String[] args) {
ListTest lt = new ListTest();
lt.testAdd();
lt.testType();
lt.testForEach();
// lt.testGet();
// lt.testIterator();
// lt.testForEach();
// lt.testModify();
// lt.testForEach();
// lt.testRemove();
}
}
5展东、學生選課----應(yīng)用泛型管理課程
package com.imooc.collection;
import java.util.ArrayList;
import java.util.List;
public class TestGeneric {
/**
* 帶有泛型——Course,的List類型屬性
*/
public List<Course> courses;
public TestGeneric() {
this.courses = new ArrayList<Course>();
}
/**
* 測試添加
*/
public void testAdd() {
Course cr1 = new Course("1","大學語文");
courses.add(cr1);
//泛型集合中炒俱,不能添加泛型規(guī)定的類型及其子類型以外的對象琅锻,否則會報錯!
// courses.add("能否添加一些奇怪的東西呢向胡?恼蓬?");
Course cr2 = new Course("2","Java基礎(chǔ)");
courses.add(cr2);
}
/**
* 測試循環(huán)遍歷
*/
public void testForEach() {
for (Course cr : courses) {
System.out.println(cr.id + ":" + cr.name);
}
}
/**
* 泛型集合可以添加泛型的子類型的對象實例
*/
public void testChild() {
ChildCourse ccr = new ChildCourse();
ccr.id = "3";
ccr.name = "我是子類型的課程對象實例~~";
courses.add(ccr);
}
/**
* 泛型不能使用基本類型
*/
public void testBasicType() {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
System.out.println("基本類型必須使用包裝類作為泛型!" + list.get(0));
}
/**
* @param args
*/
public static void main(String[] args) {
TestGeneric tg = new TestGeneric();
tg.testAdd();
tg.testForEach();
tg.testChild();
tg.testForEach();
tg.testBasicType();
}
}
package com.imooc.collection;
public class ChildCourse extends Course {
}
1.泛型集合中不能使用基本數(shù)據(jù)類型List<int>course僵芹。必須為引用類型List<Course> course
2.可以通過使用包裝類限定允許存入的基本數(shù)據(jù)類型处硬。
6、學生選課----通過 Set 集合管理課程
Set接口及其實現(xiàn)類——HashSet
- Set是元素無序并且不可以重復的集合拇派,被稱為集荷辕;
HashSet——哈希集,是Set的一個重要實現(xiàn)類
1件豌、Set沒有像List中set()方法一樣就修改疮方,因為List是有序的,可以指定位置茧彤,而Set是無序的骡显。
2、查詢遍歷時曾掂,Set不能用get()方法去獲取惫谤,因為無序沒有指定索引ID,但可以使用foreach和iterator來遍歷珠洗,但是每次遍歷出來可能順序都不一樣溜歪,還是因為無序造成的。
3许蓖、Set中的size(),add(),addAll(),remove(),removeAll()與List類似蝴猪。
4、Set還可以添加null膊爪;無序演示
package com.imooc.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class SetTest {
public List<Course> coursesToSelect;
public SetTest() {
coursesToSelect = new ArrayList<Course>();
}
/**
* 用于往coursesToSelect中添加備選課程
*/
public void testAdd() {
// 創(chuàng)建一個課程對象自阱,并通過調(diào)用add方法,添加到備選課程List中
Course cr1 = new Course("1", "數(shù)據(jù)結(jié)構(gòu)");
coursesToSelect.add(cr1);
Course temp = (Course) coursesToSelect.get(0);
// System.out.println("添加了課程:" + temp.id + ":" + temp.name);
Course cr2 = new Course("2", "C語言");
coursesToSelect.add(0, cr2);
Course temp2 = (Course) coursesToSelect.get(0);
// System.out.println("添加了課程:" + temp2.id + ":" + temp2.name);
// coursesToSelect.add(cr1);
// Course temp0 = (Course) coursesToSelect.get(2);
// System.out.println("添加了課程:" + temp.id + ":" + temp.name);
// 以下方法會拋出數(shù)組下標越界異常
// Course cr3 = new Course("3", "test");
// coursesToSelect.add(4, cr3);
Course[] course = { new Course("3", "離散數(shù)學"), new Course("4", "匯編語言") };
coursesToSelect.addAll(Arrays.asList(course));
Course temp3 = (Course) coursesToSelect.get(2);
Course temp4 = (Course) coursesToSelect.get(3);
// System.out.println("添加了兩門課程:" + temp3.id + ":" +
// temp3.name + ";" + temp4.id + ":" + temp4.name);
Course[] course2 = { new Course("5", "高等數(shù)學"), new Course("6", "大學英語") };
coursesToSelect.addAll(2, Arrays.asList(course2));
Course temp5 = (Course) coursesToSelect.get(2);
Course temp6 = (Course) coursesToSelect.get(3);
// System.out.println("添加了兩門課程:" + temp5.id + ":" +
// temp5.name + ";" + temp6.id + ":" + temp6.name);
}
/**
* 通過for each方法訪問集合元素
*
* @param args
*/
public void testForEach() {
System.out.println("有如下課程待選(通過for each訪問):");
for (Object obj : coursesToSelect) {
Course cr = (Course) obj;
System.out.println("課程:" + cr.id + ":" + cr.name);
}
}
/**
* @param args
*/
public static void main(String[] args) {
SetTest st = new SetTest();
st.testAdd();
st.testForEach();
// 創(chuàng)建一個學生對象
Student student = new Student("1", "小明");
System.out.println("歡迎學生:" + student.name + "選課蚁飒!");
// 創(chuàng)建一個Scanner對象动壤,用來接收從鍵盤輸入的課程ID
Scanner console = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("請輸入課程ID");
String courseId = console.next();
for (Course cr : st.coursesToSelect) {
if (cr.id.equals(courseId)) {
student.courses.add(cr);
/**
* Set中萝喘,添加某個對象淮逻,無論添加多少次琼懊, 最終只會保留一個該對象(的引用), 并且爬早,保留的是第一次添加的那一個
*/
// student.courses.add(null);
student.courses.add(cr);
}
}
}
st.testForEachForSet(student);
}
public void testForEachForSet(Student student) {
// 打印輸出哼丈,學生所選的課程!
System.out.println("共選擇了:" + student.courses.size() + "門課程筛严!");
for (Course cr : student.courses) {
System.out.println("選擇了課程:" + cr.id + ":" + cr.name);
}
}
}
二醉旦、Java 中的集合框架(中)
1、Map & HashMap 簡介
2桨啃、學生選課
使用 Map 添加學生
刪除 Map 中的學生
修改 Map 中的學生
判斷 List 中課程是否存在
判斷 Set 中課程是否存在
獲取 List 中課程的位置
-
判斷 Map
package com.imooc.collection;
/**
* 課程類
* @author Administrator
*
*/
public class Course {
public String id;
public String name;
public Course(String id, String name) {
this.id = id ;
this.name = name;
}
public Course() {
}
}
package com.imooc.collection;
import java.util.HashSet;
import java.util.Set;
/**
* 學生類
* @author Administrator
*
*/
public class Student {
public String id;
public String name;
public Set<Course> courses;
public Student(String id, String name) {
this.id = id;
this.name = name;
this.courses = new HashSet<Course>();
}
}
package com.imooc.collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class MapTest {
/**
* 用來承裝學生類型對象
*/
public Map<String, Student> students;
/**
* 在構(gòu)造器中初始化students屬性
*/
public MapTest() {
this.students = new HashMap<String, Student>();
}
/**
* 測試添加:輸入學生ID车胡,判斷是否被占用 若未被占用,則輸入姓名照瘾,創(chuàng)建新學生對象匈棘,并且 添加到students中
*/
public void testPut() {
// 創(chuàng)建一個Scanner對象,用來獲取輸入的學生ID和姓名
Scanner console = new Scanner(System.in);
int i = 0;
while (i < 3) {
System.out.println("請輸入學生ID:");
String ID = console.next();
// 判斷該ID是否被占用
Student st = students.get(ID);
if (st == null) {
// 提示輸入學生姓名
System.out.println("請輸入學生姓名:");
String name = console.next();
// 創(chuàng)建新的學生對象
Student newStudent = new Student(ID, name);
// 通過調(diào)用students的put方法析命,添加ID-學生映射
students.put(ID, newStudent);
System.out.println("成功添加學生:" + students.get(ID).name);
i++;
} else {
System.out.println("該學生ID已被占用主卫!");
continue;
}
}
}
/**
* 測試Map的keySet方法
*/
public void testKeySet() {
// 通過keySet方法,返回Map中的所有“鍵”的Set集合
Set<String> keySet = students.keySet();
// 取得students的容量
System.out.println("總共有:" + students.size() + "個學生鹃愤!");
// 遍歷keySet簇搅,取得每一個鍵,再調(diào)用get方法取得每個鍵對應(yīng)的value
for (String stuId : keySet) {
Student st = students.get(stuId);
if (st != null)
System.out.println("學生:" + st.name);
}
}
/**
* 測試刪除Map中的映射
*/
public void testRemove() {
// 獲取從鍵盤輸入的待刪除學生ID字符串
Scanner console = new Scanner(System.in);
while (true) {
// 提示輸入待刪除的學生的ID
System.out.println("請輸入要刪除的學生ID软吐!");
String ID = console.next();
// 判斷該ID是否有對應(yīng)的學生對象
Student st = students.get(ID);
if (st == null) {
// 提示輸入的ID并不存在
System.out.println("該ID不存在瘩将!");
continue;
}
students.remove(ID);
System.out.println("成功刪除學生:" + st.name);
break;
}
}
/**
* 通過entrySet方法來遍歷Map
*/
public void testEntrySet() {
// 通過entrySet方法,返回Map中的所有鍵值對
Set<Entry<String, Student>> entrySet = students.entrySet();
for (Entry<String, Student> entry : entrySet) {
System.out.println("取得鍵:" + entry.getKey());
System.out.println("對應(yīng)的值為:" + entry.getValue().name);
}
}
/**
* 利用put方法修改Map中的已有映射
*/
public void testModify() {
// 提示輸入要修改的學生ID
System.out.println("請輸入要修改的學生ID:");
// 創(chuàng)建一個Scanner對象凹耙,去獲取從鍵盤上輸入的學生ID字符串
Scanner console = new Scanner(System.in);
while (true) {
// 取得從鍵盤輸入的學生ID
String stuID = console.next();
// 從students中查找該學生ID對應(yīng)的學生對象
Student student = students.get(stuID);
if (student == null) {
System.out.println("該ID不存在鸟蟹!請重新輸入!");
continue;
}
// 提示當前對應(yīng)的學生對象的姓名
System.out.println("當前該學生ID使兔,所對應(yīng)的學生為:" + student.name);
// 提示輸入新的學生姓名建钥,來修改已有的映射
System.out.println("請輸入新的學生姓名:");
String name = console.next();
Student newStudent = new Student(stuID, name);
students.put(stuID, newStudent);
System.out.println("修改成功!");
break;
}
}
/**
* @param args
*/
public static void main(String[] args) {
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
// mt.testRemove();
// mt.testEntrySet();
// mt.testModify();
// mt.testEntrySet();
}
}
- 應(yīng)用 Collections.sort()
-嘗試對學生序列排序
package com.imooc.collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
/**
* 將要完成:
* 1.通過Collections.sort()方法虐沥,對Integer泛型的List進行排序熊经;
* 2.對String泛型的List進行排序;
* 3.對其他類型泛型的List進行排序欲险,以Student為例镐依。
*/
public class CollectionsTest {
/**
* 1.通過Collections.sort()方法,對Integer泛型的List進行排序天试;
* 創(chuàng)建一個Integer泛型的List槐壳,插入十個100以內(nèi)的不重復隨機整數(shù),
* 調(diào)用Collections.sort()方法對其進行排序
*/
public void testSort1() {
List<Integer> integerList = new ArrayList<Integer>();
// 插入十個100以內(nèi)的不重復隨機整數(shù)
Random random = new Random();
Integer k;
for (int i = 0; i < 10; i++) {
do {
k = random.nextInt(100);
} while (integerList.contains(k));
integerList.add(k);
System.out.println("成功添加整數(shù):" + k);
}
System.out.println("-------------排序前--------------");
for (Integer integer : integerList) {
System.out.println("元素:" + integer);
}
Collections.sort(integerList);
System.out.println("----------------排序后-------------------");
for (Integer integer : integerList) {
System.out.println("元素:" + integer);
}
}
/**
* 2.對String泛型的List進行排序喜每;
* 創(chuàng)建String泛型的List务唐,添加三個亂序的String元素雳攘,
* 調(diào)用sort方法,再次輸出排序后的順序
*/
public void testSort2() {
List<String> stringList = new ArrayList<String>();
stringList.add("microsoft");
stringList.add("google");
stringList.add("lenovo");
System.out.println("------------排序前-------------");
for (String string : stringList) {
System.out.println("元素:" + string);
}
Collections.sort(stringList);
System.out.println("--------------排序后---------------");
for (String string : stringList) {
System.out.println("元素:" + string);
}
}
/**
* 3.對其他類型泛型的List進行排序枫笛,以Student為例吨灭。
*/
public void testSort3() {
List<Student> studentList = new ArrayList<Student>();
Random random = new Random();
studentList.add(new Student(random.nextInt(1000) + "", "Mike"));
studentList.add(new Student(random.nextInt(1000) + "", "Angela"));
studentList.add(new Student(random.nextInt(1000) + "", "Lucy"));
studentList.add(new Student(10000 + "", "Beyonce"));
System.out.println("--------------排序前---------------");
for (Student student : studentList) {
System.out.println("學生:" + student.id + ":" + student.name);
}
Collections.sort(studentList);
System.out.println("----------------排序后------------------");
for (Student student : studentList) {
System.out.println("學生:" + student.id + ":" + student.name);
}
Collections.sort(studentList, new StudentComparator());
System.out.println("----------------按照姓名排序后-----------------");
for (Student student : studentList) {
System.out.println("學生:" + student.id + ":" + student.name);
}
}
/**
* @param args
*/
public static void main(String[] args) {
CollectionsTest ct = new CollectionsTest();
// ct.testSort1();
// ct.testSort2();
ct.testSort3();
}
}
-
Comparable & Comparator
-
實現(xiàn)學生序列排序