黑马程序员技术交流社区

标题: 今天的综合练习题<2> [打印本页]

作者: obvilion    时间: 2016-9-3 22:20
标题: 今天的综合练习题<2>
2.  创建一个Person类,属性2个,分别是name和age,
定义一个String[] str = {"奶昔","加多宝","啤酒","白酒"};用来代表喝的饮料.
          a. 创建3个Person对象,从控制台获取属性值,输入格式为:姓名,年龄.(利用有参构造赋值)
          b. 将这3个person对象存入到Map集合中(map<人.要和的饮料>)
其中key是person对象,对应的value值需要随机(random)从str数组中获取
(如果person对象的年龄不满18岁则不能喝酒,也就是说如果该对象年龄小于18岁那么获取到的饮料是白酒或者啤酒则必须继续获取,直到获取到其他饮料为止.
         c. 将map中.所有信息写到当前项目Person_info.txt下(14)分
写入格式如下:
姓名:年龄,饮料
比如:
李四:15:奶昔
赵六:10:加多宝
张三:30:啤酒

继续上代码:
Person类;
[Java] 纯文本查看 复制代码

package bean;
public class Person {
        private String name;
        private int age;
        public Person() {}
        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }
//toString和equals的重写反正是个人习惯,也不耗费什么时间,
//重写hashcode是为了让测试类在写出时顺序与录入时一致
        @Override
        public String toString() {
                return "[name=" + name + ", age=" + age + "]";
        }
        @Override
        public int hashCode() {
                return 1;
        }
        @Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                Person other = (Person) obj;
                if (age != other.age)
                        return false;
                if (name == null) {
                        if (other.name != null)
                                return false;
                } else if (!name.equals(other.name))
                        return false;
                return true;
        }
}

测试类;
[Java] 纯文本查看 复制代码

package code;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;

import bean.Person;
public class Tes02 {
        public static void main(String[] args) throws IOException {
                String[] str = {"奶昔","加多宝","啤酒","白酒"};
                Map<Person, String> map = new HashMap<>();
                for (int i = 0; i < 3; i++) {
                        Person p = getPerson();
                        map.put(p, str[getDrink(p)]);                       
                }
                BufferedWriter bw = new BufferedWriter(new FileWriter("Person_info.txt"));
                for (Person key : map.keySet()) {
                        bw.write(key.getName()+":"+key.getAge()+":"+map.get(key));
                        bw.newLine();
                }
                bw.close();
        }
//这里题目没有要求考虑异常情况,所以就先这么写,二楼附上新的getPerson()和解决办法;
        @SuppressWarnings("resource")
        public static Person getPerson() {
                System.out.println("请录入人名和年龄以,分隔(格式为:\t姓名,年龄)");
                String input = new Scanner(System.in).nextLine();
                String[] s = input.split(",");
                return new Person(s[0],Integer.parseInt(s[1]));
        }
//使用递归调用直到未满十八岁者得到的饮料不为啤酒或白酒;三元运算符精简代码
        private static int getDrink(Person p) {
//匿名对象减少代码;
                int d = new Random().nextInt(4);
                return p.getAge()<18 && d > 1 ? getDrink(p): d;
        }
}

作者: obvilion    时间: 2016-9-3 22:21
本帖最后由 obvilion 于 2016-9-3 22:41 编辑

改进代码如下;
[Java] 纯文本查看 复制代码
        private static Scanner sc =new Scanner(System.in);
        private static Person getPerson() {
                System.out.print("请录入人名和年龄以,分隔(格式为:\t姓名,年龄):");
                String[] s;
                do {
                        s = sc.nextLine().split(",");                        
                } while (!isOK(s));
                return new Person(s[0],Integer.parseInt(s[1]));
        }
        private static boolean isOK(String[] s) {
                if (s.length!=2) {
//                        System.out.println("录入错误,请重输:");
                        return false;
                }
//                System.out.println(s[1].matches("\\d*")? "录入成功!" : "录入错误,请重输:");
                return s[1].matches("\\d*");
        }



撒泼打滚求打赏

作者: 378657357    时间: 2016-9-5 12:57
给组长来顶贴




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