最近在看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;
}
}