黑马程序员技术交流社区
标题:
分享自己做的6月26号的题
[打印本页]
作者:
秩宇
时间:
2013-6-30 13:56
标题:
分享自己做的6月26号的题
虽然写出来的时候已经过了时间,不过还是发出来给大家看看吧,
package Library;
/*
本题的主要难点在于
1、拒绝尾号不符合的学生
2、记录学生的进入次数
3、获得指定排名的学生
1、建立一个学生类包含三个字段,姓名、学号、进入次数
2、定义一个特殊比较器StuComp,实现按进出次数逆序排列并保证进出次数相同的人不会被删除
3、创建一个用StuComp做比较器的TreeSet。
4、把TreeSet和被禁止的id尾数传给记录函数
5、记录函数从输入中获得一个学生对象,并进行判断,
1、学生学号尾数是否为禁止尾数 输出错误
2、学生是否已经被记录
没有被记录则记录该学生,并把进入次数设置为1
已经存在,则把进入次数加1
6、返回集合
7、调用记录函数三次,每次传入不同的禁止ID尾数
8、第一题 只要返回所有记录
9、第二题,写一个返回集合中指定位置的元素的方法
10、后面几题和第二题相差不大
*/
import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;
/**
* User: 秩宇
* Date: 13-6-29
* Time: 上午10:05
*/
public class LibraryMain {
public static void main(String[] args) {
StuComp stc = new StuComp(); //比较器实例
TreeSet<Student> rel = new TreeSet<Student>(stc); //TreeSet实例
int testid = 2; //禁止进入的ID尾数
rel = run(rel, testid);
System.out.println("第一期完成");
testid = 3;
rel = run(rel, testid);
System.out.println("第二期完成");
testid = 6;
rel = run(rel, testid);
System.out.println("第三期完成");
//第一问 所有人按进入次数排序
System.out.println(rel);
//第二问 第三名是谁
System.out.println("进出次数排名第三的幸运儿是:");
System.out.println(seach(rel, 2));
//第三问 第二和第四名分别是谁,共进出几次
Student stu4 = seach(rel, 1);
Student stu5 = seach(rel, 3);
System.out.println("第二和第四名分别为:");
System.out.println(stu4);
System.out.println(stu5);
System.out.println("两人总进出次数是 :");
System.out.println(stu4.Times + stu5.Times);
//第四问 总进出次数是多少
System.out.println("总的进出次数是");
int sum = 0;
Iterator it = rel.iterator();
while (it.hasNext()) {
Student st = (Student) it.next();
sum = sum + st.Times;
}
System.out.println(sum);
}
//返回集合中指定位置的元素
public static Student seach(TreeSet ts, int i) {
Iterator it = ts.iterator();
int index = 0;
while (it.hasNext()) {
Student stuTemp = (Student) it.next();
if (index == i) {
return stuTemp;
}
index++;
}
return null;
}
//记录学生进出次数
private static TreeSet<Student> run(TreeSet<Student> rel, int testid) {
for (int i = 0; i < 10; i++) {
Student stu = input();
if (testID(stu, testid)) { //检查是否为禁止学号
System.out.println("位置紧张,该学号被禁止!");
i -= i;
} else if (!is(rel, stu)) { //测试集合中是否存在该学生,不存在就加入集合
rel.add(stu);
} else if (is(rel, stu)) { //如果该学生就把该的进出次数加1
addTimes(rel, stu);
}
}
return rel;
}
//测试是否为禁止ID
public static boolean testID(Student stu, int id) {
String temp = String.valueOf(stu.ID);
int i = Integer.valueOf(temp.substring(temp.length() - 1, temp.length()));
return i == id;
}
//集合中是否存在传入的元素
public static boolean is(TreeSet<Student> tc, Student stu) {
Iterator it = tc.iterator();
while (it.hasNext()) {
if (((Student) it.next()).ID == stu.ID) {
return true;
}
}
return false;
}
//增加进出次数
public static void addTimes(TreeSet<Student> tc, Student stu) {
Iterator it = tc.iterator();
while (it.hasNext()) {
Student stu1 = ((Student) it.next());
if (stu1.ID == stu.ID) {
stu1.Times = stu1.Times + 1;
}
}
}
//录入数据
public static Student input() {
System.out.println("请输入姓名:");
Scanner in = new Scanner(System.in);
String name = in.next();
System.out.println("请输入学号:");
int ID = (Integer.valueOf(in.next()));
Student student1 = new Student(name, ID, 1);
return student1;
}
}
复制代码
Student类
package Library;
/**
* User: 秩宇
* Date: 13-6-29
* Time: 上午9:46
*/
public class Student {
String Name;
int ID;
int Times;
public Student(String name, int ID,int times) {
Name = name;
this.ID = ID;
Times = times ;
}
//重写输出方法
@Override
public String toString(){
String rel = "姓名:"+this.Name+" "+"学号:"+this.ID+" "+"进出次数:"+this.Times+"\n";
return rel;
}
}
复制代码
比较器
package Library;
import java.util.Comparator;
/**
* User: 秩宇
* Date: 13-6-29
* Time: 上午9:48
*/
public class StuComp implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
int x = o1.Times;
int y = o2.Times;
if (x > y) {
return -1; //实现逆序排列
} else if (x == y) {
return-1; //防止进出次数相同的人被删除
} else {
return 1;
}
}
}
复制代码
作者:
秩宇
时间:
2013-6-30 13:58
题虽然做出来了,但是和公布的答案相比还是有很多不足,比如某些错误没有输出提示,比如没有体现面向对象思想等等,不过还是发出来给大家看看,希望大家共同进步。
作者:
王延龙
时间:
2013-7-6 00:39
秩宇 发表于 2013-6-30 13:58
题虽然做出来了,但是和公布的答案相比还是有很多不足,比如某些错误没有输出提示,比如没有体现面向对象思 ...
楼主不错啊,学习下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2