黑马程序员技术交流社区

标题: 第21天的学生及成绩练习,做时候虐死我了 [打印本页]

作者: MUFCRyanCR7    时间: 2015-8-29 22:04
标题: 第21天的学生及成绩练习,做时候虐死我了
/*
练习:将学生姓名和语数外三门课的分数录入,然后将三门分数加和,按照总分由高到低及
          姓名默认排序的顺序存储到studentinfo.txt文件中。

思路:1.描述学生类
          2.通过键盘获取学生的数据,并将该行中的数据取出封装为学生对象
          3.定义一个可操作学生对象的工具类
          4.要将多个学生的信息存储起来且要排序,所以选用TreeSet集合
          5.将集合中的信息写入到文件中
*/

package io;

import java.util.*;
import java.io.*;

//新建一个学生类
class Student implements Comparable<Student>                //使得学生类具备比较性
{
        private String name;
        private int CN;
        private int MA;
        private int EN;
        private int sum;
        //构造函数要求内容为String name, int CN, int MA, int EN
        Student(String name, int CN, int MA, int EN)
        {
                this.name = name;
                this.CN = CN;
                this.MA = MA;
                this.EN = EN;
                this.sum = CN+MA+EN;
        }
        //继承Comparable接口必须覆盖compareTo方法,其内部比较用compareTo方法,且类内部要覆盖hashCode和equals两个方法,
        //为默认比较提供功能,注意此处整数的比较要建立基本数据类型对象包装类,equals方法中的比较与此不同,详见下
        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 getName()
        {
                return name;
        }
        public int getSum()
        {
                return sum;
        }
        public int hashCode()
        {
                return name.hashCode()+sum*53;
        }
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Student))
                        throw new ClassCastException("类型不一致");
                Student s = (Student)obj;
                //equals中字符串的比较用equals方法,数字的比较用==
                return this.name.equals(s.name) && this.sum==s.sum;
        }
        public String toString()
        {
                return name+":语文="+CN+";数学="+MA+";英语="+EN;
        }
}

class StudentInfoTool
{
        //注意:集合上要加泛型
        public static TreeSet<Student> getStudents() throws IOException
        {
                return getStudents(null);
        }
        public static TreeSet<Student> getStudents(Comparator<Student> cmp) throws IOException
        {
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));                //建立一个读取流缓冲区
                String line = null;
                TreeSet<Student> stus = null;
                if (cmp==null)
                        stus = new TreeSet<Student>();                //建立一个TreeSet集合
                else
                        stus = new TreeSet<Student>(cmp);
                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 writeToFile(TreeSet<Student> stus) throws IOException
        {
                BufferedWriter bufw = new BufferedWriter(new FileWriter("studentinfo.txt"));
                for (Student s : stus)
                {
                        bufw.write(s.toString()+"\t");
                        bufw.write(s.getSum()+"");                //此处,sum即总分原为整数变为字符串后可避免乱码的产生
                        bufw.newLine();
                        bufw.flush();
                }
                bufw.close();
        }
}

class StudentInfo
{
        public static void main(String[] args) throws IOException
        {
                Comparator<Student> cmp = Collections.reverseOrder();                //通过Collections类中的reverseOrder方法构造一个反序的比较器
                TreeSet<Student> stus = StudentInfoTool.getStudents(cmp);                //新建一个Student的TreeSet集合并调用StudentInfoTool中
                                                                                                                                                //的getStudents方法
                StudentInfoTool.writeToFile(stus);                //调用writeToFile方法将数据输入到指定文件
        }
}


作者: binarycoc    时间: 2015-8-29 22:14
看不懂,,还没学到
作者: 代晃    时间: 2015-8-29 22:47
我也还没有学到这个地方
作者: 欲,再梦一回    时间: 2015-8-29 23:24
好难啊!看到都是浆糊
作者: MUFCRyanCR7    时间: 2015-9-1 20:23
binarycoc 发表于 2015-8-29 22:14
看不懂,,还没学到

慢慢就会学到了,这里其实不难,主要是东西多,比较繁杂,如果能有个清晰的思路,就会容易很多
作者: wyd1    时间: 2015-9-1 20:34
文件夹?
作者: MUFCRyanCR7    时间: 2015-9-1 20:36
wyd1 发表于 2015-9-1 20:34
文件夹?

不是,集合、排序、IO的综合联系
作者: cemabenteng    时间: 2015-9-1 20:48
这是基础班的东西吧,给你看看我们现在做的小案例
import java.util.ArrayList;

import com.itheima.news_listview.adapter.NewsAdapter;
import com.itheima.news_listview.bean.NewsBean;
import com.itheima.news_listview.utils.NewsUtils;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemClickListener {

        private Context mContext;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                mContext = this;
                //1.找到控件
                ListView lv_news = (ListView) findViewById(R.id.lv_news);
                //2.获取新闻数据用list封装
                ArrayList<NewsBean> allNews = NewsUtils.getAllNews(mContext);
               
                //3.创建一个adapter设置给listview
                NewsAdapter newsAdapter = new NewsAdapter(mContext, allNews);
                lv_news.setAdapter(newsAdapter);
               
                //4.设置listview条目的点击事件
                lv_news.setOnItemClickListener(this);
               
               
               
               
               
        }
        //listview的条目点击时会调用该方法 parent:代表listviw  view:点击的条目上的那个view对象   position:条目的位置  id: 条目的id
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                        long id) {
               
                //需要获取条目上bean对象中url做跳转
                NewsBean bean = (NewsBean) parent.getItemAtPosition(position);
               
                String url = bean.news_url;
               
                //跳转浏览器
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(url));
                startActivity(intent);
        }
public class NewsAdapter extends BaseAdapter {
       
        private ArrayList<NewsBean> list;
        private Context context;

        //通过构造方法接受要显示的新闻数据集合
        public NewsAdapter(Context context,ArrayList<NewsBean> list){
                this.list = list;
                this.context = context;
        }

        @Override
        public int getCount() {
                return list.size();
        }

        @Override
        public Object getItem(int position) {
                return list.get(position);
        }

        @Override
        public long getItemId(int position) {
                return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                View view = null;
                //1.复用converView优化listview,创建一个view作为getview的返回值用来显示一个条目
                if(convertView != null){
                        view = convertView;
                }else {
                        //context:上下文, resource:要转换成view对象的layout的id, root:将layout用root(ViewGroup)包一层作为codify的返回值,一般传null
//                        view = View.inflate(context, R.layout.item_news_layout, null);//将一个布局文件转换成一个view对象
                       
                        //通过LayoutInflater将布局转换成view对象
//                        view =  LayoutInflater.from(context).inflate(R.layout.item_news_layout, null);
                       
                        //通过context获取系统服务得到一个LayoutInflater,通过LayoutInflater将一个布局转换为view对象
                        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        view = layoutInflater.inflate(R.layout.item_news_layout, null);
                       
                }
                //2.获取view上的子控件对象
                ImageView item_img_icon = (ImageView) view.findViewById(R.id.item_img_icon);
                TextView item_tv_des = (TextView) view.findViewById(R.id.item_tv_des);
                TextView item_tv_title = (TextView) view.findViewById(R.id.item_tv_title);
                //3.获取postion位置条目对应的list集合中的新闻数据,Bean对象
                NewsBean newsBean = list.get(position);
                //4.将数据设置给这些子控件做显示
                item_img_icon.setImageDrawable(newsBean.icon);//设置imageView的图片
                item_tv_title.setText(newsBean.title);
                item_tv_des.setText(newsBean.des);
               
                return view;
        }

}
public class NewsUtils {

        //封装新闻的假数据到list中返回
        public static ArrayList<NewsBean> getAllNews(Context context) {

                ArrayList<NewsBean> arrayList = new ArrayList<NewsBean>();

                for(int i = 0 ;i <100;i++)
                {
                        NewsBean newsBean = new NewsBean();
                        newsBean.title ="谢霆锋经纪人:偷拍系侵权行为:";
                        newsBean.des= "称谢霆锋隐私权收到侵犯,将保留追究法律责任";
                        newsBean.news_url= "http://www.sina.cn";
                        newsBean.icon = context.getResources().getDrawable(R.drawable.ic_launcher);//通过context对象将一个资源id转换成一个Drawable对象。
                        arrayList.add(newsBean);


                        NewsBean newsBean1 = new NewsBean();
                        newsBean1.title ="知情人:王菲是谢霆锋心头最爱的人";
                        newsBean1.des= "身边的人都知道谢霆锋最爱王菲,二人早有复合迹象";
                        newsBean1.news_url= "http://www.baidu.cn";
                        newsBean1.icon = context.getResources().getDrawable(R.drawable.icon);//通过context对象将一个资源id转换成一个Drawable对象。
                        arrayList.add(newsBean1);



                        NewsBean newsBean2 = new NewsBean();
                        newsBean2.title ="热烈祝贺黑马74高薪就业";
                        newsBean2.des= "74期平均薪资20000,其中有一个哥们超过10万,这些It精英都迎娶了白富美.";
                        newsBean2.news_url= "http://www.itheima.com";
                        newsBean2.icon = context.getResources().getDrawable(R.drawable.icon2);//通过context对象将一个资源id转换成一个Drawable对象。
                        arrayList.add(newsBean2);
                }
                return arrayList;
        }

}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="20dp"
    android:paddingBottom="20dp"
    android:orientation="horizontal" >

    <ImageView
        android:layout_gravity="center"
        android:id="@+id/item_img_icon"
        android:layout_width="68dp"
        android:layout_height="68dp"
        android:layout_marginRight="10dp"
        android:src="@drawable/ic_launcher" />

    <LinearLayout
          android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:singleLine="true"
            android:id="@+id/item_tv_title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="3dp"
            android:text="title"
            android:textColor="#000000"
            android:textSize="16sp" />

        <TextView
            android:maxLines="2"
            android:id="@+id/item_tv_des"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="des"
            android:textColor="#666666"
            android:textSize="13sp" />
    </LinearLayout>

</LinearLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/lv_news"
         />

</RelativeLayout>
这只是一个小小的案例,兄弟好好学吧,就业班进度非常快
作者: Glc90    时间: 2015-9-1 20:58
看不懂....~~~
作者: Wqi    时间: 2015-9-1 21:00
不明觉历
作者: 程曦    时间: 2015-9-1 21:18
看起来好厉害的样子
作者: superhs    时间: 2015-9-1 21:21
都是学过的知识,分解开来做就不难了。。
作者: 方育伟    时间: 2015-9-1 21:45
cemabenteng 发表于 2015-9-1 20:48
这是基础班的东西吧,给你看看我们现在做的小案例
import java.util.ArrayList;

新闻客户端,我才开班几天,虽然知道哪些地方有什么作用,但是不能理解。

楼主的代码我倒是都看得懂,虽然还没学io
作者: 方育伟    时间: 2015-9-1 21:47
cemabenteng 发表于 2015-9-1 20:48
这是基础班的东西吧,给你看看我们现在做的小案例
import java.util.ArrayList;

新闻客户端,我才开班几天,虽然知道哪些地方有什么作用,但是不能理解。

楼主的代码我倒是都看得懂,虽然还没学io
作者: sunw    时间: 2015-9-1 22:23
学习了   
作者: l631356126    时间: 2015-9-1 22:32
好好学,基础扎实了,以后就看懂了。
作者: KALF    时间: 2015-9-1 22:40
学习方法很重要,基础还是打好点。多看几遍多找几本书看看。加油吧!
作者: 熊金秋    时间: 2015-9-1 22:40
思路清晰就好做,其实代码不复杂
作者: forjunjian    时间: 2015-9-1 23:13
不明觉厉,学习模仿下
作者: MilesMatheson    时间: 2015-9-1 23:55
当初也是虐死我了,一个学生,有名字,年龄,要存入语文,数学,英语成绩;最后输出总成绩和平均分;并且按平均分从高到低排序;
作者: MUFCRyanCR7    时间: 2015-9-2 20:01
MilesMatheson 发表于 2015-9-1 23:55
当初也是虐死我了,一个学生,有名字,年龄,要存入语文,数学,英语成绩;最后输出总成绩和平均分;并且按 ...

结合的知识多,前面的好些忘记了,就学生类基本能完整地写一下,里面的equals、hashCode方法的覆盖差点没写出来,不过这样的练习做一下很有助于整个知识的串联和记忆
作者: MilesMatheson    时间: 2015-9-2 21:42
MUFCRyanCR7 发表于 2015-9-2 20:01
结合的知识多,前面的好些忘记了,就学生类基本能完整地写一下,里面的equals、hashCode方法的覆盖差点没 ...

我卡在成绩录入那里,别人是用一个for循环,指定了输入科目有多少科;我用两个ArrayList,就是不大严谨;照你说的,看来是用了HashSet
作者: 双元黑马12    时间: 2015-9-2 22:04
我也还没有学到这个地方
作者: shuibole    时间: 2015-9-2 22:05
哈哈,哎,不想看了,一团浆糊~~~
作者: kuikui    时间: 2015-9-2 22:07
只能看懂一点点
作者: 笑笑精灵    时间: 2015-9-2 22:31
集合知识
作者: MUFCRyanCR7    时间: 2015-9-3 20:31
MilesMatheson 发表于 2015-9-2 21:42
我卡在成绩录入那里,别人是用一个for循环,指定了输入科目有多少科;我用两个ArrayList,就是不大严谨; ...

视频里实际用的Set,我自己用的HashSet
作者: MUFCRyanCR7    时间: 2015-9-3 20:33
双元黑马12 发表于 2015-9-2 22:04
我也还没有学到这个地方

慢慢来,不着急,只是一点一点掌握扎实就很不错了
作者: MUFCRyanCR7    时间: 2015-9-3 20:35
shuibole 发表于 2015-9-2 22:05
哈哈,哎,不想看了,一团浆糊~~~

哈哈,不是原来也是浆糊吧
作者: MUFCRyanCR7    时间: 2015-9-3 20:36
kuikui 发表于 2015-9-2 22:07
只能看懂一点点

加油,慢慢来都能看懂
作者: MUFCRyanCR7    时间: 2015-9-3 20:39
笑笑精灵 发表于 2015-9-2 22:31
集合知识

对,还有些排序和自定义类的东西
作者: panpanai    时间: 2015-9-3 20:48
感觉只看懂了一半,面向对象都快学完了。
作者: 15210373205    时间: 2015-9-3 21:27
没有学到,有点印象
作者: 双元黑马12    时间: 2015-9-3 21:40
MUFCRyanCR7 发表于 2015-9-3 20:33
慢慢来,不着急,只是一点一点掌握扎实就很不错了

面向对象 是不是学后面的 基础啊
作者: 梦龙0201    时间: 2015-9-3 21:56
cemabenteng 发表于 2015-9-1 20:48
这是基础班的东西吧,给你看看我们现在做的小案例
import java.util.ArrayList;

快到什么程度
作者: 365840837    时间: 2015-9-3 21:57
不明觉厉
作者: kitboxer    时间: 2015-9-3 22:32
我去,果然很厉害。
作者: cemabenteng    时间: 2015-9-4 19:31
梦龙0201 发表于 2015-9-3 21:56
快到什么程度

基础班的两倍差不多吧
作者: 半醉半醒半浮生    时间: 2015-9-4 19:35
好多啊  看不懂!!!!!!!!!!!!!!
作者: cemabenteng    时间: 2015-9-4 19:43
梦龙0201 发表于 2015-9-3 21:56
快到什么程度

基础打好了,不一定知识掌握的多好,把思想学好了
作者: foreverfun    时间: 2015-9-4 20:07
代码只能看懂一部分,且要自己敲出来就更加难了
作者: 王乙帆    时间: 2015-9-4 20:13
多分享几天的哈哈~~
作者: nightwish    时间: 2015-9-4 20:20
我还没看到这里,表示要抓紧了
作者: MUFCRyanCR7    时间: 2015-9-4 21:45
panpanai 发表于 2015-9-3 20:48
感觉只看懂了一半,面向对象都快学完了。

不着急,慢慢来
作者: MUFCRyanCR7    时间: 2015-9-4 21:47
15210373205 发表于 2015-9-3 21:27
没有学到,有点印象

加油~~~~~
作者: 这个肯定不重名    时间: 2015-9-4 21:48
支持支持
作者: MUFCRyanCR7    时间: 2015-9-4 21:50
双元黑马12 发表于 2015-9-3 21:40
面向对象 是不是学后面的 基础啊

对,我现在也有点忘了
作者: MUFCRyanCR7    时间: 2015-9-4 21:51
kitboxer 发表于 2015-9-3 22:32
我去,果然很厉害。

学过去也就那么回事,没什么的
作者: MUFCRyanCR7    时间: 2015-9-4 21:54
kitboxer 发表于 2015-9-3 22:32
我去,果然很厉害。

学过去也就那么回事,没什么的
作者: MUFCRyanCR7    时间: 2015-9-4 22:02
这个肯定不重名 发表于 2015-9-4 21:48
支持支持

谢谢~~~~~~~~
作者: MUFCRyanCR7    时间: 2015-9-4 22:03
nightwish 发表于 2015-9-4 20:20
我还没看到这里,表示要抓紧了

不着急,慢慢来
作者: MUFCRyanCR7    时间: 2015-9-4 22:04
王乙帆 发表于 2015-9-4 20:13
多分享几天的哈哈~~

好的,没问题
作者: MUFCRyanCR7    时间: 2015-9-4 22:05
foreverfun 发表于 2015-9-4 20:07
代码只能看懂一部分,且要自己敲出来就更加难了

没事,多加练习,多敲代码,敲着敲着就熟了
作者: 姚志昊    时间: 2015-9-4 22:15
我今天也学到这里了。。
作者: MUFCRyanCR7    时间: 2015-9-5 15:47
姚志昊 发表于 2015-9-4 22:15
我今天也学到这里了。。

加油!!




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