JavaEE學習筆記-(2)java集合框架

JCF:java集合框架

  • Collection:單值類型集合

    1.List

    類型 底層實現
    ArrayList(數組元素個數) 數組
    LinkedList() 鏈表
    Vector(數組元素個數,步長) 數組
    Stack() 數組模擬棧

    2.Set

    類型 底層實現
    HashSet(分組組數,加載因子) 哈希表
    TreeSet(比較器對象) 紅黑樹
    @HashSet

    特點:無序 唯一
    數據結構:哈希表 -》 哈希嗎值 -》 hashCode()

      創建對象:
      HashSet<泛型> set = new HashSet<>();
    
      添加元素:
      set.add(元素);
      Collections.addAll(set,元素,元素,元素....);
      set1.addAll(set2);
    
      判斷集合裏面是否包含:
      set.contains(元素)
    
      得到集合大小:
      set.size()
    
      刪除元素:
      set.remove(元素);
    
      foreach + 迭代器
      
      HashSet驗證唯一:
      	HashSet的唯一:hashCode() + equals()
    
      	hashCode():得到對象的哈希碼值 -》 決定去到哪一個小組
    
      	equals():挨個每個屬性比較 看看到底是不是同一個對象
    
    
      	java中視爲相等的兩個對象哈希碼值一定要一樣
      		x.equals(y) == true
      		x.hashCpde() == y.hashCode()
    
    import java.util.*;
    public class Exec1{
    	public static void main(String[] args){
    
    		ArrayList<String> list = new ArrayList<>();
    
    		Collections.addAll(list,"張三","李四","李四","張三","王五");
    
    		//將集合裏面的重複元素去除
    		//張三 李四 王五
    
    		ArrayList<String> temp = new ArrayList<>();
    		for(String name : list){
    			if(!temp.contains(name)){
    				temp.add(name);
    			}
    		}
    		System.out.println(temp);
    		
    
    	}
    }
    
    import java.util.*;
    public class Exec1{
    	public static void main(String[] args){
    
    		HashSet<User> mry = new HashSet<>();
    		User u1 = new User("張麗","普通用戶",1200);
    		User u2 = new User("汪美麗","普通用戶",2900);
    		User u3 = new User("趙小雪","普通用戶",300);
    		User u4 = new User("張欣","普通用戶",590);
    		User u5 = new User("羅浩","普通用戶",1900);
    		User u6 = new User("羅浩","普通用戶",1900);
    
    		//將所有用戶放進美容院集合裏面
    		Collections.addAll(mry,u1,u2,u3,u4,u5,u6);
    		/* u6 添加失敗
    			覆蓋 hashCode() 和 equals() 方法
            */
            
    		//System.out.println(mry.size());
    
    		//將所有積分>1200分的用戶等級修改成超級vip
    		//修改等級 -》 參與生成哈希碼值 -》 刪除 + 修改 + 添加
    
    		//ArrayList  LinkedList  HashSet
    
    		LinkedList<User> list = new LinkedList<>();
    
    		for(Iterator<User> car = mry.iterator();car.hasNext();){
    			User uu = car.next();
    
    			if(uu.jiFen > 1200){
    				car.remove();
    				uu.dengJi = "超級VIP";
    				list.add(uu);
    			}
    		}
    
    		//mry -> 普通用戶
    		//list -》 超級vip
    
    		mry.addAll(list);
    
    		System.out.println(mry);
    
    
    		//打印set集合對象的時候 顯示:
    			//[對象1:等級,對象2:等級....]
    
    		//分別統計普通用戶 和超級vip佔用的比例
    		int x = 0;
    		int y = 0;
    		for(User uu : mry){
    			if(uu.dengJi.equals("普通用戶")){
    				x++;
    			}else{
    				y++;
    			}
    		}
    		System.out.println("普通用戶比例:" + x * 100 / mry.size()  + "%");
    		System.out.println("超級VIP比例:" + y * 100 / mry.size()  + "%");
    
    	}
    }
    class User{
    	String name;
    	String dengJi;//等級 -》 普通用戶 超級vip
    	int jiFen;//積分
    
    	public User(String name,String dengJi,int jiFen){
    		this.name = name;
    		this.dengJi = dengJi;
    		this.jiFen = jiFen;
    	}
    
    	//只要兩個對象所有屬性都視爲相等對象
    
    	@Override
    	public int hashCode(){
    		return name.hashCode() + dengJi.hashCode() + jiFen;
    	}
    	@Override
    	public boolean equals(Object obj){
    		//if if if
    		return this.name.equals(((User)obj).name) &&
    			this.dengJi.equals(((User)obj).dengJi) &&
    				this.jiFen == ((User)obj).jiFen;
    	}
    
    	@Override
    	public String toString(){
    		return name + ":" + dengJi;
    	}
    
    }
    
    @TreeSet

    ​ 一次添加一個元素: set.add(obj)
    ​ 一次添加多個元素: Collections.addAll(set,o1,o2,o3);
    ​ 元素個數: set.size();
    ​ 刪除元素: set.remove(obj);
    ​ 清空整個集合: set.clear();
    ​ 遍歷:
    ​ 1.foreach
    ​ 2.Iterator 迭代器
    ​ 3.forEach()

    ​ TreeSet特有的方法:
    ​ first() last() 得到第一個/最後一個元素

    ​ pollFirst() pollLast() 得到並刪除第一個/最後一個元素

​ 如何利用比較器 脫離開一個類不做修改的情況下 指定這個類的排序規則
​ Comparator
​ public int compare(T t1,T t2){
​ …;
​ }

import java.util.*;
public class Homework{
	public static void main(String[] args){
		Set<Student> cjd = new TreeSet<>(new StudentComparator());
		Student s1 = new Student("明明",80,60,90);
		Student s2 = new Student("紅紅",60,90,80);
		Student s3 = new Student("涼涼",90,90,91);
		Student s4 = new Student("小王",60,60,58);
		Collections.addAll(cjd,s1,s2,s3,s4);

		//02.請遍歷所有元素 查看名次表    
		{
			cjd.forEach(System.out::println);
		}
		System.out.println("=====================================");
		//03.據說紅紅英語考試作弊 英語成績清零   
		{
			Set<Student> temp = new TreeSet<>(new StudentComparator());
			for(Iterator<Student> car = cjd.iterator(); car.hasNext(); ){
				Student stu = car.next();
				if("紅紅".equals(stu.name)){
					car.remove();//1.TestTreeSet5
					stu.english = 0;//2.
					temp.add(stu);//3.TestTreeSet6
				}
			}
			cjd.addAll(temp);

			cjd.forEach(System.out::println);
		}

		//04.小王同學英語成績有閱卷錯誤 成績應該+10
		{

		}

		//05.請打印所有平均分高於85的同學~
		{
			for(Student stu : cjd){
				if(stu.chinese + stu.math + stu.english > 255){
					System.out.println(stu);
				}
			}
		}



	}
}
/*
	01.要求 : 脫離開Student類制定Student類的比較規則		
	該規則要求:
		優先按照學生三科成績的平均分降序排列
		如果分數相同 則按照名字排列
		如果分數和名字都相同 -> 也不能捨棄元素
*/
class StudentComparator implements Comparator<Student>{
	@Override
	public int compare(Student s1,Student s2){
		int sum1 = s1.chinese + s1.math + s1.english;
		int sum2 = s2.chinese + s2.math + s2.english;
		if(sum1 != sum2)
			return sum2 - sum1;//分高的在前 降序
		if(!s1.name.equals(s2.name))
			return s1.name.compareTo(s2.name);
		return 1; //
	}
}
class Student{
	String name;
	int chinese;
	int math;
	int english;
	public Student(String name,int chinese,int math,int english){
		this.name = name;
		this.chinese = chinese;
		this.math = math;
		this.english = english;
	}
	@Override
	public String toString(){
		return name + ": " + chinese + " , " + math + " , " + english;
	}
}

Comparable 和 Comparator 有什麼區別?
這兩個接口都是用於制定排序比較的規則的
Comparable 形容詞 有能力比較的
一個類如果實現了這個接口 代表這個類型對象 是可以進行比較的 可以直接放入TreeSet完成排序
Comparator 名詞 比較專用的工具
一個類如果實現了這個接口 代表這個類型的對象 是用於比較另一個類型的工具而已
它的對象應該在創建TreeSet的時候 作爲參數傳給TreeSet

​ 它們包結構就不一樣:

​ Comparable java.lang.Comparable

​ Comparator java.util.Comparator

​ 它們當中的抽象方法不同:

​ Comparable public int compareTo(1)

​ Comparator public int compare(1,2)

  • Map:鍵值對類型集合

    類型 底層實現
    HashMap/
    Hashtable (分組組數,加載因子)
    哈希表
    TreeMap(比較器對象) 紅黑樹

    Map的基本用法

    如何創建Map集合 泛型限定主鍵和值兩個類型:
    	Map<K,V> map = new HashMap<>();
    
    如何添加元素 不再使用add() 而是put()
    	map.put(k1,v1)
    	*:注意 有map.putAll(另一個Map) 但是沒有Collections.putAll();
    
    如何得到元素個數:
    	System.out.println(map.size());
    
    如何通過主鍵對象得到對應的值對象:
    	System.out.println(map.get(k));
    
    判斷是否包含指定的主鍵:
    	System.out.println(map.containsKey(k));
    
    判斷是否包含指定的值:
    	System.out.println(map.containsValue(v));
    
    如何刪除一個鍵值對:
    	map.remove(k);
    
    如何清空整個鍵值對集合:
    	map.clear();
    

    集合該如何完成遍歷~

    keySet() : 得到所有主鍵對象組成的Set集合 map.get(k) => 得到值

    values() : 得到所有的值對象組成的Collection集合 不能反向找k
    entrySet() : 得到所有鍵值對對象(Map.Entry)組成的Set集合

import java.util.*;
public class Exec1{
	public static void main(String[] args){

		Map<String,Integer> map = new HashMap<String,Integer>();

			map.put("[蜀] 關雲長", 90);
			map.put("[蜀] 諸葛孔明" ,38);
			map.put("[魏] 張文遠" ,88);
			map.put("[魏] 夏侯妙才",80);
			map.put("[羣] 呂奉先" ,100);
			map.put("[吳] 周公瑾" ,85);
			map.put("[吳] 魯子敬" ,32);
			map.put("[魏] 郭奉孝" ,20);

		//請問我們總共收錄了多少個英雄的信息? 
		System.out.println(map.size());





		//主鍵 -》 Set<主鍵類型> set = map.keySet();
		//值 -》 Collection<值類型> cs = map.values();
		//主鍵+值 -》 Set<Map.Entry<主鍵,值>> set = map.entrySet();


		//請問 總共有多少個英雄名字像鬼子?	 
		int count1 = 0;
		Set<String> set1 = map.keySet();
		for(String name : set1){
			if(name.length() > 7){
				count1++;
			}
		}
		System.out.println("有"+count1+"個鬼子");
		//請問 總共有多少個吳國的武將
		int count2 = 0;
		Set<String> set2 = map.keySet();
		for(String name : set2){
			if(name.contains("[蜀]")){
				count2++;
			}
		}
		System.out.println("有"+count2+"個蜀國的武將");
		//請問 所有英雄的平均武力值是多少	
		int sum = 0;
		Collection<Integer> cs = map.values();
		for(Integer power: cs){
			sum += power;
		}
		System.out.println("平均值:"+sum / map.size());

		int s=0;
		Collection<Integer> cs1 = map.values();
				for(Integer power: cs){
					if(power>80){
						s++;
						}
		}
		System.out.println("大於80:"+ s);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章