1.hashset
public class HashSetDemo {
public static void main(String[]
args) {
Set<String> set= new HashSet<String>();
set.add( "A");
set.add( "B");
set.add( "C");
set.add( "D");
set.add( "E");
set.add( "A");//重复添加
set.add( "B");
set.add( "F");
System. out.println(set);
}
}
结果:
[D, E, F, A, B, C]
从结果中发现Hashset集合是不重复且无序的
2.有序的TreeSet
public class TreeSetDemo
{
public static void main(String[]
args) {
Set<String>set= new TreeSet<String>();
set.add( "C");
set.add( "B");
set.add( "A");
set.add( "D");
set.add( "E");
set.add( "A");//重复添加
set.add( "B");
set.add( "F");
System. out.println(set);
}
}
结果:
[A, B, C, D, E, F]
3.对TreeSet排序的探索
既然TreeSet可以排序,那么它可以对我们自己写的类型进行排序不?
class Person{
private String Name;
private int age ;
public String
getName() {
return Name ;
}
public void setName(String
name) {
Name =
name;
}
public int getAge()
{
return age ;
}
public void setAge(int age)
{
this.age =
age;
}
public Person(String
name, int age) {
Name =
name;
this.age =
age;
}
}
public class TreeSetDemo1
{
public static void main(String[]
args) {
Set<Person> set= new TreeSet<Person>();
set.add( new Person("aaa" ,
12));
set.add( new Person("adc" ,
12));
set.add( new Person("abc" ,
12));
set.add( new Person("aac" ,
12));
set.add( new Person("aaa" ,
13));
System. out.println(set);
}
}
结果:
Exception in thread "main" java.lang.ClassCastException:
JHTest.Person cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare( TreeMap.java:1188)
at java.util.TreeMap.put( TreeMap.java:531)
at java.util.TreeSet.add( TreeSet.java:255)
at JHTest.TreeSetDemo1.main( TreeSetDemo1.java:41)
类转换错误
出现这个错误的原因是对于一个对象要想排序,必须要实现排序法则,且对象所在类必须实现Comparable接口
4.探索继续
class Person implements Comparable<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(String
name, int age) {
this.name =
name;
this.age =
age;
}
public int compareTo(Person
per) {
if(this .age >per.age ){
return 1;
} else if (this.age<per.age){
return -1;
} else {
return 0;
}
}
@Override
public String
toString() {
return "名字" +this.name+"年龄"+ this.age ;
}
}
public class TreeSetDemo1
{
public static void main(String[]
args) {
Set<Person> set= new TreeSet<Person>();
set.add( new Person("aaa" ,
12));
set.add( new Person("adc" ,
12));
set.add( new Person("abc" ,
10));
set.add( new Person("aac" ,
11));
set.add( new Person("aaa" ,
13));
System. out.println(set);
}
}
结果:
[名字abc年龄10, 名字aac年龄11, 名字aaa年龄12, 名字aaa年龄13]
补充:这个发现有个 new Person("adc" ,
12)这个没有加进来,这是因为之比较了一个属性,那treeSet就只会比较一个属性,如果这个属性相同,就认为是一个对象
5.对HashSet的探索(关于重复元素)
class Per{
private
String name;
private String age;
public String
getName() {
return name ;
}
public void setName(String
name) {
this.name =
name;
}
public String
getAge() {
return age ;
}
public void setAge(String
age) {
this.age =
age;
}
public Per(String
name, String age) {
this.name =
name;
this.age =
age;
}
@Override
public String
toString() {
return "名字" +this.name+"姓名"+ this.age ;
}
}
public class HashSetDemo1 {
public static void main(String[]
args) {
Set<Per> set= new HashSet<Per>();
set.add( new Per("AAA" , "10" ));
set.add( new Per("BBB" , "11" ));
set.add( new Per("AAA" , "12" ));
set.add( new Per("AAB" , "13" ));
set.add( new Per("ABA" , "10" ));
set.add( new Per("AAA" , "10" ));
System. out.println(set);
}
}
结果:
[名字AAB姓名13, 名字AAA姓名10, 名字BBB姓名11, 名字AAA姓名10, 名字AAA姓名12, 名字ABA姓名10]
我们发现这里重复了?
这里如果想要比较我们的类型的对象是否重复就要覆写Object 的equals方法和hashCode方法
class Per{
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;
}
@Override
public String
toString() {
return "名字" + this. name+ "姓名"+ this .age ;
}
@Override
public int hashCode()
{
return this .name .hashCode()
* this. age;
}
@Override
public boolean equals(Object
obj) {
if (this ==obj){
return true ;
}
if (!(obj instanceof Per)){
return false ;
}
Per p=(Per)obj;
if (this .name .equals(p. name)&& this .age ==p.age ){
return true ;
} else {
return false ;
}
}
public Per(String
name, int age) {
this .name =
name;
this .age =
age;
}
}
public class HashSetDemo1
{
public static void main(String[]
args) {
Set<Per> set= new HashSet<Per>();
set.add( new Per("AAA" ,
10));
set.add( new Per("BBB" ,
11));
set.add( new Per("AAA" ,
12));
set.add( new Per("AAB" ,
13));
set.add( new Per("ABA" ,
10));
set.add( new Per("AAA" ,
10));
System. out .println(set);
}
}
结果:
[名字AAA姓名12, 名字ABA姓名10, 名字AAA姓名10, 名字AAB姓名13, 名字BBB姓名11]