1.hashset
java學習之路-----集合(類集)-------set
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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.