案例
双十一过后,某公司每天都能收到很多快递,门卫小张想要统计收到快递的人员名单,以便统一通知,现请你帮他编写一段Java程序,统计出需要取快递的人员名单。
可以通过循环一个一个录入有快递的人员姓名,并添加到集合中,由于集合有去重功能,这样最后得到的就是一个不重复的人员名单。
分析
由题意可知,遇到这种需要录入人员姓名,并且要查看的简单程序,可以用数组,也可以使用集合~
1.选择集合类型
但是,提到去重功能,就得看咱们的集合了,集合又分为了以下几种
其中List集合是有序可重复类型,而Set集合是无序不可重复类型,所以这次结合实际需求当然要选Set集合啦!
所以,我们创建了一个HashSet集合,这时候肯定有小迷糊问:为什么不用TreeSet呢?
TreeSet内部其实是按照平衡二叉树的算法对数进行排序,记住是数!大于该数的放在右子树,小于该数的放在左子树……但是,等等!
我们要解决的是录入人员姓名的问题,人员姓名总不不是数字吧,不然细思极恐“嗨,001,我是002……”
有这会功夫去编码,excel统计表格都做好了,所以综上所述,我们在一堆集合里选择了HashSet
HashSet<> hs = new HashSet();
不要忘记导包哦,它在java.util包下
2.定义Person类,重写方法
又因为本次写程序的重点是人类,所以在定义集合的时候要限定集合的类型——只能是人类,如此一来,Person类就诞生了!
具体代码如下,其中重写了三个方法,均可使用快捷键生成,eclipse可以右键选择重构,IDEA则使用Alt+Insert选择以下三种方法自动生成~(快速写代码技巧get!)
package classCode.person;
public class Person {
String name;
public Person(String name) {
this.name = name;
}
//重写equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return name != null ? name.equals(person.name) : person.name == null;
}
//重写hashCode方法
@Override
public int hashCode() {
return name != null ? name.hashCode() : 0;
}
//重写toString方法
@Override
public String toString() {
return
"姓名:" + name
;
}
}
3.创建while循环
由于不知道具体录入多少个人员信息,所以我们采用循环,在那三大循环中,最简单明了的当属while循环,只需要让条件判断语句一直为true就能变成死循环了!
没错,就是这么霸道,那到什么时候结束呢,当然是我想结束的时候结束,这个时候if语句紧跟其后,随便定义一个字母,等我输入他的时候才能结束。
键盘录入数据,当我输入的数据为o时,就跳出while循环,执行下一步。此时需要用到equals方法。
那如果输入的不是o呢,如果不是,则将输入的人名添加到集合中,由于规定的集合类型是Person类,所以添加的必须是Person类的对象。
添加对象啊,简单简单~创建一个就好啦!
4.遍历集合
如此一来,我们已经完成该任务的90%了,只差最后一步——遍历,得到集合内容。
Set集合常用的遍历方式是使用迭代器,这里嘛,只需要新建一个迭代器,对每一个集合中的元素遍历,使用while循环,条件判断语句使用迭代器的hashNext()方法查看是否有下一个元素,如果有返回true接着进入循环,如果没有则为false结束循环。
在while循环内部,同样需要使用迭代器的方法,这里使用的是next()方法,返回下一个元素,关于第一个元素怎么出来这个问题可以康康第一个元素的前世今生这篇文章,看看这个可爱的小家伙是怎么来的。
来,到了最关键的时候,运行!!!
上截图~
熊出没的粉丝默默路过……
代码汇总
package classCode.person;
/*这是一个测试类*/
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
public class PersonDemo {
public static void main(String[] args) {
HashSet<Person> hs=new HashSet<Person> ();
Scanner sc=new Scanner(System.in);
// 不知道具体人数,用while循环
while(true) {
System.out.println("请输入收件人姓名(退出 o)");
// 键盘录入数据
String s=sc.next();
// 将键盘录入数据与o作比较,如果相同,退出循环,查看录入人数信息
if(s.equals("o")) {
break;
}else {
hs.add(new Person(s));
}
}
// 遍历
Iterator i= hs.iterator();
while (i.hasNext()){
Object o = i.next();
System.out.println(o);
}
}
}
package classCode.person;
public class Person {
String name;
public Person(String name) {
this.name = name;
}
//重写equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return name != null ? name.equals(person.name) : person.name == null;
}
//重写hashCode方法
@Override
public int hashCode() {
return name != null ? name.hashCode() : 0;
}
//重写toString方法
@Override
public String toString() {
return
"姓名:" + name
;
}
}
感谢父老乡亲们看到这儿,恭喜你在Java道路上又消灭了一个boss,咱们山高水长江湖下期见~