技术分享 JAVA基础 查看内容

Java编程之Map中分拣思想

老高 | 发布于 2017-08-24 08:34| 浏览()| 评论() | 收藏() | 点赞() | 打印

题目:给定一个字符串,求出字符串中每一个单词在字符串中出现的次数

旨意:map的分拣思想。

每一个key的包装类,存放出现的次数

/**
 * 作为包装类,用来存放英文单词,和该英文单词出现的次数
 */
public class Str {
    private String st;
    private int count;
    public Str() {
        super();
    }
    public String getSt() {
        return st;
    }
    public void setSt(String st) {
        this.st = st;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
}
/**
 * 字符串:this is a cat and that is a nice and where is the food
 * 将该字符串的每个单词出现的次数统计出来
 * 【分拣的思想】
 *  第一种:为所有key创建容器 之后存放对应的value
 *  第二种:第一次创建容器,并存放value 第二次之后,直接使用容器存放value
 */
public class TestMap {
    
    public static void main(String[] args) {
        test4();
        
    }
    
    //第一种分拣思路 (1)先为所有的key创建对应的容器(2)为对应key的容器中存放值
	
    public static void test1(){
        String sts="this is a cat and that is a nice and where is the food";
        //将字符串分割成一个个单词,并存放入数组中
        String[] strings=sts.split(" ");
        //创建一个map对象,用来存放单词和单词出现的次数
        Map<String, Str> countMap=new HashMap<String, Str>();
        //第一种分拣思想
        //第一步:为所有的key创建容器,
        for(int i=0;i<strings.length;i++){
            String temp=strings[i];
            //判断map是否含有此key,如果有返回true,否则返回false
            //第一次为所有的key创建容器
            if(!countMap.containsKey(temp)){
                Str str=new Str();
                countMap.put(temp, str);
            }
        }
        
        //第二步:使用容器,存放值
        for(String temp:strings){
            Str clsStr=countMap.get(temp);
            clsStr.setCount(clsStr.getCount()+1);
            clsStr.setSt(temp);
        }
        
        
        //测试countMap是否算是成功达到目的
        Set<String> keys=countMap.keySet();
        for (String key:keys) {
            Str sd=countMap.get(key);
            Integer cInteger=sd.getCount();
            System.out.println("字母:"+key+"--次数:"+cInteger);
        }
        
    }
    
    public static void test2(){
        String sts="this is a cat and that is a nice and where is the food";
        //将字符串分割成一个个单词,并存放入数组中
        String[] strings=sts.split(" ");
        //创建一个map对象,用来存放单词和单词出现的次数
        Map<String, Str> countMap=new HashMap<String, Str>();
        //第一种分拣思想
        //第一步:为key创建容器的同时,并存放值
        for(int i=0;i<strings.length;i++){
            String temp=strings[i];
            //判断map是否含有此key,如果有返回true,否则返回false
            //先创建容器,之后为容器存放值
            if(!countMap.containsKey(temp)){
                Str str=new Str();
                countMap.put(temp, str);
            }
			//使用容器存放值
			Str str=countMap.get(temp);
			str.setCount(str.getCount()+1);
		
        }
        
        //测试countMap是否算是成功达到目的
		Set<String> keys=countMap.keySet();
		for (String key:keys) {
			Str sd=countMap.get(key);
			Integer cInteger=sd.getCount();
			System.out.println("字母:"+key+"--次数:"+cInteger);
		}
    }

    //分拣第二种思想 (1)第一次为key创建容器,并存放值(2)第二次使用容器存放值
    public static void test3(){
        String sts="this is a cat and that is a nice and where is the food";
        //将字符串分割成一个个单词,并存放入数组中
        String[] strings=sts.split(" ");
        //创建一个map对象,用来存放单词和单词出现的次数
        Map<String, Str> countMap=new HashMap<String, Str>();
        //第一种分拣思想
        //第一步:为key创建容器的同时,并存放值
        for(int i=0;i<strings.length;i++){
            String temp=strings[i];
            //判断map是否含有此key,如果有返回true,否则返回false
            //第一次创建容器,并为容器中存放值
            if(!countMap.containsKey(temp)){
                Str str=new Str();
                str.setCount(1);
                countMap.put(temp, str);
            }else{
                //第二次使用容器存放值
                Str str=countMap.get(temp);
                str.setCount(str.getCount()+1);
            }
        }
        
        //测试countMap是否算是成功达到目的
		Set<String> keys=countMap.keySet();
		for (String key:keys) {
			Str sd=countMap.get(key);
			Integer cInteger=sd.getCount();
			System.out.println("字母:"+key+"--次数:"+cInteger);
		}
    }
    

    public static void test4(){
        String sts="this is a cat and that is a nice and where is the food";
        //将字符串分割成一个个单词,并存放入数组中
        String[] strings=sts.split(" ");
        //创建一个map对象,用来存放单词和单词出现的次数
        Map<String, Str> countMap=new HashMap<String, Str>();
        //第一种分拣思想
        //第一步:为key创建容器的同时,并存放值
        for(int i=0;i<strings.length;i++){
            String temp=strings[i];
            //判断map是否含有此key,如果有返回true,否则返回false
            //第一次创建容器,并为容器中存放值
            Str str=null;
            if(null==(str=countMap.get(temp))){
                 str=new Str();
                str.setCount(1);
                countMap.put(temp, str);
            }else{
                //第二次使用容器存放值
                 str=countMap.get(temp);
                str.setCount(str.getCount()+1);
            }
        }
        
        //测试countMap是否算是成功达到目的
		Set<String> keys=countMap.keySet();
		for (String key:keys) {
			Str sd=countMap.get(key);
			Integer cInteger=sd.getCount();
			System.out.println("字母:"+key+"--次数:"+cInteger);
		}
    }
}

分拣思想的应用:

需求:查询出学生List集合,对学生集合进行加工,将学生按照班级分类,并求出班级的总分和平均分

思路:map分拣思想。需要创建一个班级po,班级po里存放学生信息,该班集的总分,班级号码。

Student的po

/**
 * 学生对象
 */
public class Student {
    private String name;//姓名
    private String no;//班级
    private Integer score;//分数
    
    
    public Student() {
        super();
    }
    
    public Student(String name, String no, Integer 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 Integer getScore() {
        return score;
    }
    public void setScore(Integer score) {
        this.score = score;
    }
    
    
}

需要进行存放学生信息的ClassRoom的po

package com.bjsxt.xiaofei;

import java.util.HashSet;
import java.util.Set;

public class ClassRoom {
    private String no;//班级号码
    private Set<Student> students;//班级里的学生
    private Integer countScore;//总分
    
    public ClassRoom(){
        students=new HashSet<Student>();
    }
    
    public ClassRoom(String no, Integer countScore) {
        this();
        this.no = no;
        this.countScore = countScore;
    }

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public Set<Student> getStudents() {
        return students;
    }

    public void setStudents(Set<Student> students) {
        this.students = students;
    }

    public Integer getCountScore() {
        return countScore;
    }

    public void setCountScore(Integer countScore) {
        this.countScore = countScore;
    }
    
    
}

加工学生list集合,并进行测试

package com.bjsxt.xiaofei;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 从学生表里查询出一个学生集合,现在求出每个班级的成绩总分,和平均分。
 * 利用Map的分拣思想,做到。
 */
public class Test2 {
    public static void main(String[] args) {
        //获取学生集合
        List<Student> studentList=queryAll();
        //加工学生集合。返回一个map.map里装的是key:【班级号】 value:【classRoom】
        Map<String,ClassRoom> classMap=processStList(studentList);
        //测试Map
        testMap(classMap);
    }
    
    //获得学生集合
    public static List<Student> queryAll(){
        List<Student> list=new ArrayList<Student>();
        list.add(new Student("a", "一班", 80));
        list.add(new Student("b", "二班", 100));
        list.add(new Student("c", "三班", 60));
        list.add(new Student("d", "一班", 80));
        list.add(new Student("e", "二班", 100));
        list.add(new Student("f", "三班", 60));
        return list;
    }
    
    //加工学生集合,返回Map
    public static  Map<String, ClassRoom> processStList(List<Student> studentList){
        //生成一个map
        Map<String, ClassRoom> classMap=new HashMap<String, ClassRoom>();
        
        //遍历学生集合
        for(Student st:studentList){
            //获取当前学生的班级号码,和成绩
            String classNum=st.getNo();
            Integer score=st.getScore();
            //如果map中不含该学生的班级号,则为该学生创建新班级对象,并将该学生信息存入其中
            if(!classMap.containsKey(classNum)){
                //创建班级
                ClassRoom cls=new ClassRoom();
                //将班级号和班级作为映射关系,存放入classMap
                classMap.put(classNum, cls);
                //将当前此学生的信息存入班级中
                cls.setCountScore(score);
                Set<Student> set=cls.getStudents();
                set.add(st);
                
            }else{
                //通过存在的班级号,往里存放当前学生
                ClassRoom cls=classMap.get(classNum);
                cls.setCountScore(cls.getCountScore()+score);
                Set<Student> set=cls.getStudents();
                set.add(st);
            }            
            
            
        }
        
        return classMap;
    }
    
    
    
    public static void testMap(Map<String, ClassRoom> classMap){
        //遍历map
        Set<String> set=classMap.keySet();
        //遍历set中的map键
        for (String key : set) {
            //班级
            ClassRoom cls=classMap.get(key);
            //打印要求的信息
            System.out.println("班级号码:"+key+"   班级总分:"+cls.getCountScore()+"   班级平均分"+cls.getCountScore()/cls.getStudents().size());
        }
        
    }
}

第二种测试里,展现了另一种map的遍历方法和set集合的三种遍历方法

public static void testMap(Map<String, ClassRoom> classMap){
	//第二种遍历Map。将Map装换成set集合,set集合里的每一个对象是map的映射关系新组成的一个Map.Entry的对象。通过getkey() getvalue()方法获取KEY-VALUE的映射
	Set<Map.Entry<String,ClassRoom>> setEntry=classMap.entrySet();
	
	//第一种遍历set集合  将set集合转换成数组
	Object[] objects=setEntry.toArray();
	for(int i=0;i<objects.length;i++){
		Map.Entry<String, ClassRoom> entyr=(Entry<String, ClassRoom>) objects[i];
		String classNum=entyr.getKey();
		ClassRoom cls=entyr.getValue();
		System.out.println("普通for班级号码:"+classNum+"----班级总分:"+cls.getCountScore()+"----班级平均分"+cls.getCountScore()/cls.getStudents().size());
		
	}
	
	//第二种遍历set集合 增强for循环
	for(Map.Entry<String, ClassRoom> entry:setEntry){
		
		String classNum=entry.getKey();
		ClassRoom cls=entry.getValue();
		System.out.println("班级号码:"+classNum+"----班级总分:"+cls.getCountScore()+"----班级平均分"+cls.getCountScore()/cls.getStudents().size());
	}
	
	//第三种遍历set集合:利用迭代器遍历Set集合
	Iterator<Map.Entry<String, ClassRoom>> iterator=setEntry.iterator();
	while (iterator.hasNext()) {
		Map.Entry<String, ClassRoom> entry=iterator.next();
		String classNum=entry.getKey();
		ClassRoom cls=entry.getValue();
		System.out.println("班级号码:"+classNum+"----班级总分:"+cls.getCountScore()+"----班级平均分"+cls.getCountScore()/cls.getStudents().size());
		
	}
}


发表评论(对文章涉及的知识点还有疑问,可以在这里留言,老高看到后会及时回复的。)

表情