对ArrayList中的对象求和求均值后排序

ahujyy 2008-08-02 04:38:26
有个ArrayList,里面存3000学生成绩对象,如
class StuGra{
String stuName;//学生名字
String courseName;//课程名称
Integer courseRes;//该课程的成绩
}
里面一个学生因选多门课程就拥有多个StuName对象。
要求用最有效率的代码实现:
以这种格式在控制台输出结果:
StuName(学生名) total(总分) avg(平均分)
...全文
810 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahujyy 2008-08-04
  • 打赏
  • 举报
回复
呵呵,我要的是总分排序啊。结帖吧
mayuanfei 2008-08-03
  • 打赏
  • 举报
回复
还是用数据库来处理。
  • 打赏
  • 举报
回复
只表示了一下,因为lz没给数据,所以list里哪来那么多的数据测试啊。
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 songshuxing 的回复:]
楼上的平均分和总分一样?????
[/Quote]
神啊。
添加的数据,有的只给了他一个成绩。。。
看最后那个。
Kool宋 2008-08-03
  • 打赏
  • 举报
回复
楼上的平均分和总分一样?????
gfcs19840222 2008-08-03
  • 打赏
  • 举报
回复
这是使用sort按名字排的。你如果按总分的话,最好在StuGra中增添一个总分变量,这样才好在compare方法中调用。

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class StuGra {
String stuName;// 学生名字
String courseName;// 课程名称
int courseRes;// 该课程的成绩

public String getStuName() {
return stuName;
}

public void setStuName(String stuName) {
this.stuName = stuName;
}

public String getCourseName() {
return courseName;
}

public void setCourseName(String courseName) {
this.courseName = courseName;
}

public int getCourseRes() {
return courseRes;
}

public void setCourseRes(int courseRes) {
this.courseRes = courseRes;
}

}

public class test {

public static void main(String[] args) {
StuGra temp1 = new StuGra();
temp1.setStuName("你");
temp1.setCourseName("语文");
temp1.setCourseRes(99);

StuGra temp2 = new StuGra();
temp2.setStuName("你");
temp2.setCourseName("数学");
temp2.setCourseRes(86);

StuGra temp3 = new StuGra();
temp3.setStuName("我");
temp3.setCourseName("语文");
temp3.setCourseRes(100);

StuGra temp4 = new StuGra();
temp4.setStuName("他");
temp4.setCourseName("数据结构");
temp4.setCourseRes(50);
StuGra temp5 = new StuGra();
temp5.setStuName("你");
temp5.setCourseName("java");
temp5.setCourseRes(56);

List<StuGra> list = new ArrayList<StuGra>();
list.add(temp1);
list.add(temp2);
list.add(temp3);
list.add(temp4);
list.add(temp5);
Collections.sort(list, new CompareStu());
int cur = 0;
String name = list.get(cur).getStuName();
int ts = 0;
int sc = 0;
for(int i =0;i<list.size();i++)
{
StuGra stu = list.get(i);
if(name.equals(stu.getStuName()))
{
sc++;
ts += stu.getCourseRes();
}else{
System.out.println(name + " " + ts+" "+(ts/(float)sc));
sc = 0;
ts = 0;
name = stu.getStuName();
i--;
}
}
System.out.println(name + " " + ts+" "+(ts/(float)sc));

}

}

class CompareStu implements Comparator {

public int compare(Object sourceObj, Object targetObj) {
StuGra source = (StuGra) sourceObj;
StuGra target = (StuGra) targetObj;
int n = 0;
String sn = source.getStuName();
String tn = target.getStuName();
if(sn.compareTo(tn)<0)//sn tn
n = -1;
else if(sn.compareTo(tn)>0)
n = 1;
else
n = 0;
return n;
}

}


ahujyy 2008-08-03
  • 打赏
  • 举报
回复
如果在zhangkai的代码前用Collecitons.sort(al,myComparator)按名字排序是能达到最后结果按名字排序的目的。但如果要求按总分递减输出来,怎么办呢?
  • 打赏
  • 举报
回复
o了。。大体给你表示下。。
肯定不是效率最好的,不过结果是对的。。。你看下吧。。

package com.zhangkai.test;

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

class StuGra {
String stuName;// 学生名字
String courseName;// 课程名称
int courseRes;// 该课程的成绩

public String getStuName() {
return stuName;
}

public void setStuName(String stuName) {
this.stuName = stuName;
}

public String getCourseName() {
return courseName;
}

public void setCourseName(String courseName) {
this.courseName = courseName;
}

public int getCourseRes() {
return courseRes;
}

public void setCourseRes(int courseRes) {
this.courseRes = courseRes;
}

}

public class TestList {

public static void main(String[] args) {
StuGra temp1 = new StuGra();
temp1.setStuName("你");
temp1.setCourseName("语文");
temp1.setCourseRes(99);

StuGra temp2 = new StuGra();
temp2.setStuName("你");
temp2.setCourseName("数学");
temp2.setCourseRes(86);

StuGra temp3 = new StuGra();
temp3.setStuName("我");
temp3.setCourseName("语文");
temp3.setCourseRes(100);

StuGra temp4 = new StuGra();
temp4.setStuName("他");
temp4.setCourseName("数据结构");
temp4.setCourseRes(50);
StuGra temp5 = new StuGra();
temp1.setStuName("你");
temp1.setCourseName("java");
temp1.setCourseRes(56);

List<StuGra> list = new ArrayList<StuGra>();
list.add(temp1);
list.add(temp2);
list.add(temp3);
list.add(temp4);
Map<String, Integer> map = new HashMap<String, Integer>();
Map<String, Integer> map2 = new HashMap<String, Integer>();
for (StuGra sg : list) {
StuGra s = sg;
map2.put(s.getStuName(), 1);
if (map.containsKey(s.getStuName())) {
int i = map.get(s.getStuName()).intValue();
int j = map2.get(s.getStuName());
j += 1;
i += s.getCourseRes();
map.put(s.getStuName(), i);
map2.put(s.getStuName(), j);
} else {

map.put(s.getStuName(), s.getCourseRes());
}
}
Set s = map.keySet();
for (Object i : s) {
double j = map.get(i) / map2.get(i);
System.out.println(i.toString() + "的平均分是:" + j);
System.out.println(i.toString() + "的总分是:" + map.get(i));
}

}

}
结果:
他的平均分是:50.0
他的总分是:50
我的平均分是:100.0
我的总分是:100
你的平均分是:71.0
你的总分是:142
自己按格式排好就行了。。

  • 打赏
  • 举报
回复
用map试试。。
ahujyy 2008-08-02
  • 打赏
  • 举报
回复
里面一个学生因选多门课程就拥有多个StuName对象。
我写错了
里面一个学生因选多门课程就拥有多个StuGra对象。


按姓名排序后 怎么判断有几个连续的对象呢?这样才能算总和和均值啊
能详细点么。
xuhaiyang 2008-08-02
  • 打赏
  • 举报
回复
先对arraylist按姓名排序,然后输出

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧