黑马程序员技术交流社区

标题: 编码问题 [打印本页]

作者: 盛亚昆    时间: 2012-3-26 17:23
标题: 编码问题
import java.io.*;
import java.util.*;
class Student implements Comparable<Student>
{
        private String name;
        private int shuxue,yuwen,yingyu;
        private int sum;
        Student(String name,int shuxue,int yuwen,int yingyu )
        {
        this.name=name;
        this.shuxue=shuxue;
        this.yuwen=yuwen;
        this.yingyu=yingyu;

        sum=shuxue+yuwen+yingyu;
        }
        public String getName()
        {
                return name;
        }
        public int getSum()
        {
        return sum;
       
        }
        public int hashCode()
        {
                return name.hashCode()+sum*78;
       
        }
        public boolean equals(Object obj)
        {
                if (!(obj instanceof Student))
                        throw new ClassCastException("类型不匹配");
                        Student s=(Student)obj;
                return this.name.equals(s.name)&&this.sum==s.sum;
        }
        public  int compareTo(Student s)
        {
                int num =new Integer(this.sum).compareTo(new Integer (s.sum));
                        if(num==0)
                                return this.name.compareTo(s.name);
                        return num;
       
        }
        public String toString()
        {
                return "student["+name+","+shuxue+","+yuwen+","+yingyu+"]";
       
        }

}
class StudentInfoTool
{
        public static Set<Student>getStudents()throws IOException
        {
       
                return getStudents(null);
       
        }



        public static Set<Student>getStudents(Comparator<Student> cmp)throws IOException//方法,返回集合
        {
        BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));//读取键盘

        String line=null;
        Set<Student>stus=null;
        if (cmp==null)
                stus=new TreeSet<Student>();
        else
                stus=new TreeSet<Student>(cmp);//进行比较创建TreeSet集合
        while((line=bufr.readLine())!=null)
        {
                if("over".equals(line))
                        break;
                String []info=line.split(",");//信息之间用逗号隔开

                Student stu=new Student(info[0],Integer.parseInt(info[1]),Integer.parseInt(info[2]),Integer.parseInt(info[3]));//把学生信息封装成对象并放到集合里面,就要创建集合
       
                stus.add(stu);

        }
        bufr.close();
        return stus;
        }
        public static void write2File(Set<Student> stus)throws IOException
        {
                BufferedWriter bufw=new BufferedWriter(new FileWriter("stuinfo.txt"));
                for(Student stu :stus)
                {
                 bufw.write(stu.toString()+"\t");//"\t"为什么这个地方识别不了啊
                 bufw.write(stu.getSum()+"");//加一个“”这个 就能了啊 ,高手指点啊?????
                 bufw.newLine();
                 bufw.flush();
                }
       
                bufw.close();
        }



}


class  StudentInfo
{
        public static void main(String[] args) throws IOException
        {
                Comparator<Student> cmp=Collections.reverseOrder();//反转比较器
                Set<Student>stus=StudentInfoTool.getStudents(cmp);
               
                StudentInfoTool.write2File(stus);
                System.out.println("Hello World!");
        }
}
/*
我的结果怎么是这种格式啊??高手指点
student[zhaoliu,85,71,89]          245
student[zhouqi,87,45,92]          224
student[zhangsan,92,80,50]          222
student[wanwu,45,85,79]  209
student[lisi,45,54,54]          153

*/
作者: 刘基军    时间: 2012-3-26 22:52
查看API,
1.BufferedWriter类:
public void write(int c)
           throws IOException写入单个字符
覆盖:
类 Writer 中的 write
2.再看Writer类:
public void write(int c)
           throws IOException写入单个字符。要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。
所以,
bufw.write(stu.getSum()+"");//这边若是不加"",就是调用的是BufferedWriter的写入字符的方法,当查看文件时,看到的就不是int型数据如:200,而是它所代表的字符了!
至于"bufw.write(stu.toString()+"\t");//"\t"为什么这个地方识别不了啊"------不了解LZ的意思,
作者: 贠(yun)靖    时间: 2012-3-27 05:23
bufw.write(stu.toString()+"\t");//"\t"为什么这个地方识别不了啊
      因为windows里面的换行时两个控制符组成的    \r\t
  bufw.write(stu.getSum()+"");//加一个“”这个 就能了啊 ,高手指点啊?????
         int类型+“”    相当与把  把int类型的数字 转换成了 String类型的字符串了

你输出的那种格式 是因为Student复写toString方法   而你写的时候stu.toString()  就调用了这个方法
        public String toString()
        {
                return "student["+name+","+shuxue+","+yuwen+","+yingyu+"]";
        
        }


作者: 盛亚昆    时间: 2012-3-27 09:36
谢谢 指点
作者: 〆_xin_、_跳    时间: 2012-3-27 10:37
bufw.write(stu.toString()+"\t");//"\t"为什么这个地方识别不了啊   应该写为"\r\t"
stu.getSum()+""的意思为将int类型的数据转换为字符串数据

因为你Student类覆盖了toString()方法,并且你返回值形式又为return "student["+name+","+shuxue+","+yuwen+","+yingyu+"]";
所以输出格式为student[zhaoliu,85,71,89]          245





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2