实习代码
Public class StudentGrade{
Public String name;
Public String lesson;
Public float grade;
}
现在有一个2000个studentGrade的对象放在一个ArrayList中,为arrayList,现在我们要把每个学生的总成绩,和平均成绩求出来,并且按平均成绩排序输出,
比如:
Name Totalgrade avgGrade
John 400 80
Tom 360 75
请给出实现
没有做出来,不知道怎么实现?:(,大概想了想,就是找出每个人选了多少课,但是不知道怎么在ArrayList中做
Public class StudentGrade{
Public String name;
Public String lesson;
Public float grade;
}
现在有一个2000个studentGrade的对象放在一个ArrayList中,为arrayList,现在我们要把每个学生的总成绩,和平均成绩求出来,并且按平均成绩排序输出,
比如:
Name Totalgrade avgGrade
John 400 80
Tom 360 75
请给出实现
没有做出来,不知道怎么实现?:(,大概想了想,就是找出每个人选了多少课,但是不知道怎么在ArrayList中做
1 前戏
两种方法,一种A实现Compilable,要么用到Comparator2 重点戏
Collections.sort()
其实就两个重点的地方一,根据名字统计学生总成绩,平均成绩
二,排序
然后用Collections.sort()方法搞定排序……
tom肯定占了5个对象,假如为s10-s14,怎么求他的总成绩
A{
name, total, number
}List<A> list=============================
for(StudentGrade s : arrayList){
boolean contain;
for(A a : list){
if(a.name == s.name){
// 分数相加, number++
contian = true;
}
}
if(!contain){
list.add(new A(name, score, 1))
}
}
List students = new ArrayList();
students.add(new StudentGrade("John", "PE", 90));
students.add(new StudentGrade("Mary", "Math", 90));
students.add(new StudentGrade("John", "English", 70));
students.add(new StudentGrade("Mary", "Music", 90));
students.add(new StudentGrade("Iris", "Article", 60));
students.add(new StudentGrade("Mary", "English", 70));
students.add(new StudentGrade("Iris", "PE", 90));
students.add(new StudentGrade("John", "Math", 80)); //先排序
Collections.sort(students, new Comparator() {
public int compare(Object obj1, Object obj2) {
StudentGrade studentGrade1 = (StudentGrade) obj1;
StudentGrade studentGrade2 = (StudentGrade) obj2;
return studentGrade1.getName().compareTo(studentGrade2.getName());
}
}); System.out.println("Name\tTotalGrade\tavgGrade");
float totalGrade = 0;
int lessonCount = 0;
String lastName = "";
String name = "";
for (int i = 0; i < students.size(); i++) {
StudentGrade studentGrade = (StudentGrade) students.get(i);
name = studentGrade.getName();
// 比较姓名是否发生变化,若没变化,则继续累加总成绩和科目数
if (name.equals(lastName) || i == 0) {
totalGrade += studentGrade.getGrade();
lessonCount++;
}
// 若姓名发生变化,则打印上一人的成绩,并重新开始累加总成绩和科目数
else {
System.out.println(lastName + "\t" + totalGrade + "\t" + totalGrade / lessonCount);
totalGrade = studentGrade.getGrade();
lessonCount = 1;
}
lastName = name;
}
System.out.println(lastName + "\t" + totalGrade + "\t" + totalGrade / lessonCount);
}
结果是:
Name TotalGrade avgGrade
Iris 150.0 75.0
John 240.0 80.0
Mary 250.0 83.333336
用SQL的话求和、排序是不是更方便点啊
class StudentGrade {
public String name; public String lesson; public float grade; public StudentGrade(String name, String lesson, float grade) {
this.name = name;
this.lesson = lesson;
this.grade = grade;
}
}public class Count{
public Map countGrade(ArrayList sc){
String name="";
ArrayList<Float> smap = new ArrayList<Float>();
Map<String,List> pmap = new HashMap<String,List>();
for(Iterator isc = sc.iterator();isc.hasNext(); ){
StudentGrade s = (StudentGrade)isc.next();
name = s.name;
float perSum=0;
int sum =0;
float avg =0;
smap.clear();
for(Iterator it = sc.iterator();it.hasNext(); ){
StudentGrade sn = (StudentGrade)it.next();
if(name.equals(sn.name)){
sum +=1;
perSum += sn.grade;
avg = perSum / sum;
}
}
smap.add(perSum);
smap.add(avg);
ArrayList<Float> a = new ArrayList<Float>();
for(Float f :smap){
a.add(f);
}
pmap.put(name,a);
}
return pmap;
}
public static void main(String[] args){
StudentGrade[] arr = {new StudentGrade("yr","A",80),new StudentGrade("yr","A",69),new StudentGrade("yr","e",85),new StudentGrade("yr1","A1",90),new StudentGrade("yr1","A1",98),new StudentGrade("yr5","A1",98)};
ArrayList arrl = new ArrayList();
Collections.addAll(arrl, arr);
Map s = new Count().countGrade(arrl);
System.out.println(s);
}
原版,还没来得及优化,没时间了。。应该对 的
2000*2000+的,效率~~~~~,
计算完A的分数和平均分,将ArrayList里边的信息remove();
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;public class Count
{
public String name;
public float totalGrade = 0f;
public float avgGrade = 0f;
/**
* @param args
*/
public static void main(String[] args)
{
StudentGrade[] arr = {
new StudentGrade("yr", "A", 80),
new StudentGrade("yr", "A", 69),
new StudentGrade("yr", "e", 85),
new StudentGrade("yr1", "A1", 90),
new StudentGrade("yr1", "A1", 98),
new StudentGrade("yr5", "A1", 70)
};
ArrayList arrl = new ArrayList();
Collections.addAll(arrl, arr);// 将所有指定元素添加到指定 collection 中。 Count obj = new Count();
List list = obj.countGrade(arrl); for(Iterator iterator = list.iterator(); iterator.hasNext();)
{
Count count = (Count) iterator.next();
System.out.println(count.name + "\t" + count.avgGrade + "\t" + count.totalGrade);
} }
public List countGrade(ArrayList list)
{
String name = "";
Count count = null;
ArrayList gradeList = new ArrayList(); for(Iterator it = list.iterator(); it.hasNext();)
{
StudentGrade st = (StudentGrade) it.next(); name = st.name;
int lessonNum = 0;
float totalGrade = 0f;
float avgGrade = 0f; for(Iterator it2 = list.iterator(); it2.hasNext();)
{
StudentGrade st2 = (StudentGrade) it2.next(); if(name.equals(st2.name))
{
lessonNum += 1;
totalGrade += st2.grade;
avgGrade = totalGrade / lessonNum;
}
}
count = new Count();
count.name = name;
count.avgGrade = avgGrade;
count.totalGrade = totalGrade; if(!gradeList.contains(count))
{
gradeList.add(count);
} } //排序
Collections.sort(gradeList, new Comparator()
{ public int compare(Object o1, Object o2)
{
Count obj = (Count) o1;
Count other = (Count) o2;
if(obj.avgGrade > other.avgGrade)
{
return 1;
}
if(obj.avgGrade == other.avgGrade)
{
return 0;
}
else
{
return -1;
}
} });
return gradeList;
}
public boolean equals(Object obj)
{
if(obj == null)
{
return false;
} if(obj instanceof Count)
{
Count other = (Count) obj; return (this.name == other.name);
}
else
{
return false;
} }
public int hashCode()
{
return super.hashCode();
}}class StudentGrade
{
public String name;
public String lesson;
public float grade;
public StudentGrade(String name, String lesson, float grade)
{
this.name = name;
this.lesson = lesson;
this.grade = grade;
}}
yr5 70.0 70.0
yr 78.0 234.0
yr1 94.0 188.0
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;public class PrintStudent {
public static List<StudentDetail> processStudentGrade(List<StudentGrade> list){
List<StudentDetail> sds = new ArrayList<StudentDetail>();
Map<String,List<Object>> map = new HashMap<String,List<Object>>();
for(StudentGrade sg : list){
String name = sg.name;
Integer grade = sg.grade;
if(map.containsKey(name)){
List temp = map.get(name);
Integer totolGrade = (Integer)temp.get(0);
temp.set(0, (totolGrade+grade));
Integer count = (Integer)temp.get(1);
temp.set(1, count+1);
}else{
List save = new ArrayList();
save.add(grade);
save.add(1);
save.add(name);
map.put(name, save);
}
}
Set<String> set = map.keySet();
Iterator it = set.iterator();
while(it.hasNext()){
String name =(String) it.next();
List<Object> l = map.get(name);
StudentDetail sd = new StudentDetail();
sd.setName((String)l.get(2));
int totalGrade = (Integer)l.get(0);
sd.setTotalGrade(totalGrade);
sd.setAveGrade(totalGrade/(Integer)l.get(1));
sds.add(sd);
}
return sds;
}
public static void print(List<StudentDetail> list){
Collections.sort(list);
System.out.println("Name\tTotalgrade\tavgGrade");
for(int i = 0 ;i<list.size();i++ ){
StudentDetail sd = list.get(i);
System.out.println(sd.getName()+"\t"+sd.getTotalGrade()+"\t"+sd.getAveGrade());
}
}
public static void main(String[] args) {
List<StudentGrade> students = new ArrayList<StudentGrade>();
students.add(new StudentGrade("John", "PE", 90));
students.add(new StudentGrade("Mary", "Math", 90));
students.add(new StudentGrade("John", "English", 70));
students.add(new StudentGrade("Mary", "Music", 90));
students.add(new StudentGrade("Iris", "Article", 60));
students.add(new StudentGrade("Mary", "English", 70));
students.add(new StudentGrade("Iris", "PE", 90));
students.add(new StudentGrade("John", "Math", 80));
students.add(new StudentGrade("John", "PE", 90));
students.add(new StudentGrade("John", "PE", 90));
students.add(new StudentGrade("Iris", "Article", 100));
students.add(new StudentGrade("Iris", "Article", 100));
students.add(new StudentGrade("Iris", "Article", 100));
students.add(new StudentGrade("Iris", "Article", 100));
PrintStudent.print(PrintStudent.processStudentGrade(students));
}
}
============================================================================================
package test;public class StudentDetail implements Comparable {
private String name;
private int totalGrade;
private double aveGrade;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTotalGrade() {
return totalGrade;
}
public void setTotalGrade(int totalGrade) {
this.totalGrade = totalGrade;
}
public double getAveGrade() {
return aveGrade;
}
public void setAveGrade(double aveGrade) {
this.aveGrade = aveGrade;
}
@Override
public int compareTo(Object o) {
if(o instanceof StudentDetail){
StudentDetail sd = (StudentDetail) o;
return (int) (aveGrade - (int)sd.getAveGrade());
}
return 0;
}
}