import java.util.Comparator;
import java.util.HashSet;
import java.util.TreeSet;
import org.junit.Test;
public class 三道题的答案在这里 {
/*
* 需求:定义一个HashSet集合对象,里面存放的是Person对象,Person含有name、age属性,我们认为,当name和age
* 都相同时,就认为是同一个元素!
* 然后在HashSet对象中,存放2个人(“林青霞”,26),
* 再存放 1 个人 (“林志颖”,29)
* 最后打印这个集合,思考运行结果
*/
@Test
public void 第一道题答案() {
HashSet<Person> hs = new HashSet<Person>();
hs.add(new Person("林青霞",26));
hs.add(new Person("林青霞",26));
hs.add(new Person("林志颖",29));
System.out.println(hs);
}
/*
* TreeSet练习题
* 利用 Comparator来完成元素的排序,具体需求如下:
*
* 创建一个TreeSet集合,要求把添加到这个集合中的String对象进行排序,排序规则如下:
* 1、先按照长度排序,长度大的排在后面
* 2、长度一样的情况,按照自然顺序排序
*/
@Test
public void 第二道题答案(){
TreeSet<String> ts = new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int len = o1.length()-o2.length();
if (len==0) {
int num = o1.compareTo(o2);
return num==0?1:num;
}else{
return len;
}
}
});
ts.add("沙鳄鱼");
ts.add("鹰眼");
ts.add("千八烦恼风");
ts.add("三千世界");
ts.add("三千世界");
for (String s : ts) {
System.out.print(s + " ");
}
}
/*
* TreeSet练习题
*
* 要求使用 Comparable进行排序,
* 先按照语文成绩排序,分数高的在前面
* 语文成绩一样的,按照数学成绩排序,分数大的在前面
* 数学成绩一样的,按照英语成绩排序,分数大的在前面
*
* 分数都相同,按照姓名的自然顺序进行排序
*
* 下面参数意义:姓名,语文成绩,数学成绩,英语成绩
* new Student("lingqingxia", 89, 95, 100)
* new Student("lingqing", 89, 96, 98)
* new Student("lingqing", 89, 96, 100)
* new Student("lingqing", 69, 98, 70)
* new Student("lingqingxia", 100, 95, 100)
* new Student("zhaosi", 100, 95, 100)
*/
@Test
public void 第三道题答案() {
Student s1 = new Student("lingqingxia", 89, 95, 100);
Student s2 = new Student("lingqing", 89, 96, 98);
Student s3 = new Student("lingqing", 89, 96, 100);
Student s4 = new Student("lingqing", 69, 98, 70);
Student s5 = new Student("lingqingxia", 100, 95, 100);
Student s6 = new Student("zhaosi", 100, 95, 100);
TreeSet<Student> ts = new TreeSet<Student>();
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
for (Student student : ts) {
System.out.println(student);
}
}
/*
* 必须重写hashCode()方法和equals()方法
*/
class Person{
private String name;
private int 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;
}
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
return name.hashCode()*31 + age*19;
}
@Override
public boolean equals(Object obj) {
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
/*
* 因为我知道这个Person类是给HashSet调用的,而不是其他地方调用。所以这里的代码已经满足需求了
*/
}
}
class Student implements Comparable<Student>{
private String name;
private int chinese;
private int math;
private int english;
public Student() {
super();
}
public Student(String name, int chinese, int math, int english) {
super();
this.name = name;
this.chinese = chinese;
this.math = math;
this.english = english;
}
public String toString() {
return name + "," + chinese + "," + math + "," + english ;
}
@Override
public int compareTo(Student o) {
/*
* 先按照语文成绩排序,分数高的在前面
* 语文成绩一样的,按照数学成绩排序,分数大的在前面
* 数学成绩一样的,按照英语成绩排序,分数大的在前面
*
* 分数都相同,按照姓名的自然顺序进行排序
*/
int yuwen = this.chinese-o.chinese;
if (yuwen==0) {
int shuxue = this.math-o.math;
if (shuxue==0) {
int yingyu = this.english-o.english;
if (yingyu==0) {
return this.name.compareTo(o.name);
}else{
return -yingyu;
}
}else{
return -shuxue;
}
}else{
return -yuwen;
}
}
}
}
|
|