容器分类

对容器中的对象按属性分类,用面向对象的思路看看如何实现。

案例:学生类Student中,包含属性(成绩,班级,姓名)。生成若干学生对象,求出各个班级的平均分。

这个问题若干直接使用循环判断,找到所有的班级种类再按班级找学生,再存储,过程非常复杂。

面向对象的思路:建立一个班级类,用于储存属于这个班级的学生;再用一个Map容器储存(班级名称,班级对象)。

代码:

  1 package com.hlyc.Stream;
  2
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.List;
  6 import java.util.Map;
  7 import java.util.Map.Entry;
  8 import java.util.Set;
  9
 10 public class Demo1 {
 11     public static void main(String args[]){
 12         List list = new ArrayList();
 13         generate(list);
 14         Map<String, ClassRoom> map = new HashMap<String, ClassRoom>();
 15         count(list, map);
 16         Set<Entry<String, ClassRoom>> entrySet = map.entrySet();
 17         for(Entry<String, ClassRoom> entry : entrySet)
 18             System.out.println(entry.getKey() + "班" + "\t总分:"
 19                     + entry.getValue().getTotal() + "\t平均分:"
 20                                 + entry.getValue().getTotal()/entry.getValue().getList().size());
 21     }
 22     public static void generate(List<Student> list){
 23         list.add(new Student("1", 120, "c"));
 24         list.add(new Student("2", 130, "x"));
 25         list.add(new Student("3", 140, "y"));
 26         list.add(new Student("3", 105, "z"));
 27         list.add(new Student("2", 107, "a"));
 28         list.add(new Student("1", 110, "b"));
 29     }
 30     public static void count(List<Student> list, Map<String, ClassRoom> map){
 31         for(Student student : list){
 32             String cid = student.getCid();
 33             double grade = student.getGrade();
 34             if(!map.containsKey(cid))
 35                 map.put(cid, new ClassRoom());
 36             map.get(cid).setTotal(map.get(cid).getTotal() + grade);
 37             map.get(cid).getList().add(student);
 38         }
 39     }
 40 }
 41 class Student{
 42     private String cid;
 43     private double grade;
 44     private String name;
 45     public String getCid() {
 46         return cid;
 47     }
 48     public void setCid(String cid) {
 49         this.cid = cid;
 50     }
 51     public double getGrade() {
 52         return grade;
 53     }
 54     public void setGrade(double grade) {
 55         this.grade = grade;
 56     }
 57     public String getName() {
 58         return name;
 59     }
 60     public void setName(String name) {
 61         try {
 62             this.name = name;
 63         } finally {
 64             // TODO: handle finally clause
 65         }
 66     }
 67     public Student(String cid, double grade, String name) {
 68         this.cid = cid;
 69         this.grade = grade;
 70         this.name = name;
 71     }
 72     public Student(){
 73
 74     }
 75     @Override
 76     public String toString() {
 77         return "Student [cid=" + cid + ", grade=" + grade + ", name=" + name + "]";
 78     }
 79 }
 80 class ClassRoom{
 81     private String cid;
 82     private double total;
 83     List<Student> list;
 84     public String getCid() {
 85         return cid;
 86     }
 87     public void setCid(String cid) {
 88         this.cid = cid;
 89     }
 90     public double getTotal() {
 91         return total;
 92     }
 93     public void setTotal(double total) {
 94         this.total = total;
 95     }
 96     public List<Student> getList() {
 97         return list;
 98     }
 99     public void setList(List<Student> list) {
100         this.list = list;
101     }
102     public ClassRoom(String cid, double total, List<Student> list) {
103         this.cid = cid;
104         this.total = total;
105         this.list = list;
106     }
107     public ClassRoom(){
108         this.list = new ArrayList();
109     }
110     @Override
111     public String toString() {
112         return "ClassRoom [cid=" + cid + ", total=" + total + ", list=" + list + "]";
113     }
114 }

这样就很简单了。不相信的同学可以试试使用循环遍历加判断的方法做。

时间: 2024-08-06 07:54:20

容器分类的相关文章

走进Java中的持有对象(容器类)之一 容器分类

Java容器可以说是增强程序员编程能力的基本工具,本系列将带您深入理解容器类. 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 Class clazz; 也可以通过数组来持有多个对象,如 Class[] clazs = new Class[10]; 然而,一般情况下,我们并不知道要创建多少对象,或者以何种方式创建对象.数组显然只能创建固定长度的对象,为了使程序变得更加灵活与高效,Java类库提供了一套完整的容器类,具备完善

Sword STL容器分类介绍

标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.slist是一个单向链表,rope本质上是一个重型字符串 非标准关联容器hash_set.hash_multiset.hash_map和hash_multimap. 标准STL容器提供了四种不同的迭代器:iterator. const_iterator.reverse_iterator和const_reverse_i

简单的容器分类

容器深入研究 -- 完整的容器分类

下面是集合类库更加完备的图

[Think In Java]基础拾遗3 - 容器、I/O、NIO、序列化

目录 第十一章 持有对象第十七章 容器深入研究第十八章 Java I/O系统 第十一章 持有对象 1. java容器概览 java容器的两种主要类型(它们之间的主要区别在于容器中每个“槽”保存的元素个数):Collection和Map. (1)Collection是一个独立元素的序列,这些元素都服从一条或者多条规则.Collection概括了序列的概念——一种存放一组对象的方式. List:按照插入的顺序保存元素(ArrayList,LinkedList) Set:不能有重复元素(HashSet

Java 容器

在实际问题中我们经常需要处理数据,单纯依靠数组来存储数据对开发来说非常困难,java提供了一套容器来方便我们编程.对java容器有一个整体的了解对我们来说非常重要,这样在需要特定容器时,不会手忙脚乱,本文主要介绍java的一些基本容器,而不要仅知道使用ArrayList.下面的图片是java中的简单容器分类   --图片来自网络 java定义了四种容器类型,List.Set.Queue和Map. 其中List.Set.Queue都实现了Collection接口,下面来看看这4中类型的容器. Co

初探STL之关联容器

关联容器 分类:set, multiset, map, multimap 特点:内部元素有序排列,新元素插入的位置取决于它的值,查找速度快. 常用函数: find: 查找等于某个值 的元素(x小于y和y小于x同时不成立即为相等) lower_bound : 查找某个下界 upper_bound : 查找某个上界 equal_range : 同时查找上界和下界 count :计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等) insert: 用以插入一个元素或一个区间 set 特点:

Spring IoC容器初始化过程

IoC容器是什么?IoC文英全称Inversion of Control,即控制反转,我么可以这么理解IoC容器: 把某些业务对象的的控制权交给一个平台或者框架来同一管理,这个同一管理的平台可以称为IoC容器. 我们刚开始学习spring的时候会经常看到的类似下面的这代码: ApplicationContext appContext = new ClassPathXmlApplicationContext("cjj/models/beans.xml"); Person p = (Per

C++ STL 基础及应用(6) 容器

读者可能有这样的经历,自己编写了动态数组类.链表类.集合类和映射类等程序,然后小心地维护着.其实 STL 提供了专家级的几乎我们所需要的各种容器,功能更好,效率更高,复用性更强,所以开发应用系统应该首选 STL 容器类,摒弃自己的容器类,尽管它可能花费了你很多的开发时间. 本章将介绍 STL 中的通用容器 包括 vector.deque.list.queue和stack.priority_queue.bitset.set和multiset.map和multimap等等. 概述 容器分类 (1)序