JAVA學習筆記38——模擬實現Iterator+HashMap的“分揀”原理+“分揀”的應用

最近在看JAVA教學的視頻,覺得老師講的很好,同時借用源代碼還有筆記來撰寫本系列博客,記錄自己的學習內容,同時也供看到的人學習。

本篇介紹三個內容,一個是模擬實現一個簡陋的迭代器,第二個是介紹一下HashMap的“分揀”原理,第三個是進行一個相應的應用。

首先來看第一個內容:

import java.util.Iterator;
/**
 * 簡化迭代器原理 加入接口 提供方法
 * hasNext
 * next
 */
public class MyArrayList3 implements java.lang.Iterable<String> {
	private String[] elem ={"a","b","c","d","e","f","g"};
	private int size = elem.length;
	/**
	 * 匿名內部類
	 * @return
	 */	
	public Iterator<String> iterator(){
		return new Iterator<String>(){
			private int cursor =-1;
			/**
			 * 判斷是否存在下一個元素
			 * @return
			 */
			public boolean hasNext(){		
				return cursor+1<size;
			}
			/**
			 * 獲取下一個元素
			 */
			public String next(){
				cursor++; //移動一次
				return elem[cursor];
			}
			/**
			 * 刪除元素
			 */
			public void remove(){
				//沒有實現
			}
		};
	}
	public static void main(String[] args) {
		MyArrayList3 list = new MyArrayList3();
		Iterator<String> it =list.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
			it.remove(); //Iterator可以在查看元素的時候刪除元素
		}
		it =list.iterator();//相當於重新new,初始化
		while(it.hasNext()){
			System.out.println(it.next());
		}
		System.out.println("增強for,必須實現java.lang.Iterable接口,重寫iterator方法");
		for(String temp:list){  //注意這裏的寫法
			System.out.println(temp);
		}
	}
}
接下倆介紹“分揀”原理: "分揀" 思路:1、爲所有key創建容器,之後在每個容器中存放相應的value;2、第一次創建容器,並存放值value,第二次之後,直接使用容器存放值,不用再另外創建容器。可以類比一家淘寶網店往外發一批快遞,快遞公司按照快遞的郵寄地的不同進行分推,然後分別處理每一堆快遞的郵遞工作。

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
 * this is a cat and that is a mice and where is the food?
 * 統計每個單詞出現的次數
 * 
 * 存儲到Map中
 * key :String 
 * value:自定義類型
 * 
 * "分揀" 思路:
 * 1、爲所有key創建容器,之後在每個容器中存放相應的value
 * 2、第一次創建容器,並存放值value,第二次之後,直接使用容器存放值,不用再另外創建容器
 */
public class Demo01 {
	public static void main(String[] args) {
		String str ="this is a cat and that is a mice and where is the food";
		//分割字符串
		String[] strArray=str.split(" ");
		//存儲到Map中
		Map<String,Letter>  letters = new HashMap<String,Letter>();
		for(String temp:strArray){			
			/*
			 //1、爲所有key創建容器		 
			if(!letters.containsKey(temp)){
				Letter col = new Letter();
				col.setCount(1); //第一次值存放容器中
				letters.put(temp, col);
			}else{
				//2、	 第二次之後,直接使用容器存放值
				Letter col =letters.get(temp); //直接使用容器
				col.setCount(col.getCount()+1);
			}*/
			//兩步合成一步
			Letter col = null;
			if(null==(col=letters.get(temp))){  //先判斷有沒有該容器
				col = new Letter();  //沒有則創建
				col.setCount(1); //1,第一次值存放容器中,初始個數爲1
				letters.put(temp, col);
			}else{
				//2、	 第二次之後,直接使用容器存放值,不用再創建容器				
				col.setCount(col.getCount()+1);
			}
		}
		//輸出Map的值
		Set<String> keys = letters.keySet();
		for(String key:keys){
			Letter col =letters.get(key);
			System.out.println("字母:"+key+",次數"+col.getCount());
		}	
	}
	public static void test1(){
		String str ="this is a cat and that is a mice and where is the food";
		//分割字符串
		String[] strArray=str.split(" ");
		//存儲到Map中
		Map<String,Letter>  letters = new HashMap<String,Letter>();
		/*
		for(String temp:strArray){
			
			 //1、爲所有key創建容器, 之後容器中存放對應value
			if(!letters.containsKey(temp)){
				letters.put(temp, new Letter());
			}
		}
		for(String temp:strArray){
			//  容器中存放對應value
			Letter col =letters.get(temp); //直接使用容器
			col.setCount(col.getCount()+1);
		}
		*/
		for(String temp:strArray){
			 //1、爲所有key創建容器		 
			if(!letters.containsKey(temp)){
				letters.put(temp, new Letter());
			}
			//2、	 之後容器中存放對應value
			Letter col =letters.get(temp); //直接使用容器
			col.setCount(col.getCount()+1);
		}
		//輸出Map的值
		Set<String> keys = letters.keySet();
		for(String key:keys){
			Letter col =letters.get(key);
			System.out.println("字母:"+key+",次數"+col.getCount());
		}
	}
}
public class Letter {
	private String name;
	private int count;
	public Letter() {
		// TODO Auto-generated constructor stub
	}
	public Letter(String name, int count) {
		super();
		this.name = name;
		this.count = count;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
}
最後是一個更加綜合的面向對象組合的應用,也用到了“分揀”原理(題目要求在代碼註釋裏面):

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * 定義一個Student類,屬性:name 姓名,classNumber 班號,score 成績
   現在將若干Student對象放入List,請統計出每個班級的總分和平均分,分別打印出來
 以面向對象的思維解決
 */
public class MapDemo03 {
	public static void main(String[] args) {
		List<Student> list = new ArrayList<Student>();
		exam(list);		
		//統計		
		Map<String,ClassRoom> rooms = new HashMap<String,ClassRoom>();
		count(rooms,list);
		//打印
		printScore(rooms);
	}
	/**
	 * 打印 總分與平均分
	 */
	public static void printScore(Map<String,ClassRoom> rooms){
		Set<Map.Entry<String,ClassRoom>> entrySet =rooms.entrySet();
		Iterator<Map.Entry<String,ClassRoom>> it =entrySet.iterator();
		while(it.hasNext()){
			Map.Entry<String,ClassRoom> entry =it.next();
			ClassRoom room = entry.getValue();
			double avg = room.getTotal()/room.getStus().size();
			System.out.println("班號爲:"+room.getNo()+",總分"+room.getTotal()+",平均分"+avg);
		}		
	}
	/**
	 * 統計分數
	 */
	public static void count(Map<String,ClassRoom> rooms,List<Student> list){
		for(Student stu:list){
			String no = stu.getNo();
			double score = stu.getScore();
			//根據班級編號 查看 Map是否存在該班級  分揀思路
			ClassRoom room = rooms.get(no);
			if(null==room){  //第一次
				room = new ClassRoom(no);
				rooms.put(no, room);
			}			
			//存儲 總分
			room.setTotal(room.getTotal()+score);
			room.getStus().add(stu); //加入學生			
		}
	}
	/**
	 * 現在將若干Student對象放入List
	 * @param list
	 */
	public static void exam(List<Student> list){
		list.add(new Student("a","001",80));
		list.add(new Student("b","001",80));
		list.add(new Student("a","002",80));
		list.add(new Student("c","003",80));
		list.add(new Student("d","003",80));
	}
}
public class Student {
	private String name;
	private String no;
	private double score;
	public Student() {
	}
	public Student(String name, String no, double score) {
		super();
		this.name = name;
		this.no = no;
		this.score = score;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getNo() {
		return no;
	}
	public void setNo(String no) {
		this.no = no;
	}
	public double getScore() {
		return score;
	}
	public void setScore(double score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", no=" + no + ", score=" + score
				+ "]";
	}
}
import java.util.ArrayList;
import java.util.List;
/**
 * 班級
 */
public class ClassRoom {
	private String no;
	private List<Student> stus; //學生列表
	private double total; //總分
	public ClassRoom() {
		stus = new ArrayList<Student>();	
	}
	public ClassRoom(String no) {
		this();  //加上這個以實現初始化
		this.no = no;	
	}
	public String getNo() {
		return no;
	}
	public void setNo(String no) {
		this.no = no;
	}
	public List<Student> getStus() {
		return stus;
	}
	public void setStus(List<Student> stus) {
		this.stus = stus;
	}
	public double getTotal() {
		return total;
	}
	public void setTotal(double total) {
		this.total = total;
	}
}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章