Set是一個(gè)接口
- 無(wú)序
- 不重復(fù)
- 實(shí)現(xiàn)類有HashSet TreeSet
HashSet
Set hs = new HashSet();
hs.add("1");
hs.add("2");
hs.add("abc");
hs.add("ab");
hs.add(123);
hs.add('a');
for(Object val : hs) {
System.out.print(val + ",");
}
==> 打印結(jié)果:1,ab,a,2,abc,123,
- remove() 刪除方法
hs.remove("abc");
System.out.println("\n==========刪除后=============");
for(Object val : hs) {
System.out.print(val + ",");
}
==> 打印結(jié)果:1,ab,a,2,123,
- remove() + add() 模擬修改
hs.remove('a');
hs.add('b');
System.out.println("\n==========模擬修改后=============");
for(Object val : hs) {
System.out.print(val + ",");
}
==> 打印結(jié)果:1,ab,2,b,123,
- contains() 查詢方法
System.out.println("\n==========查詢=============");
boolean flag = hs.contains('b');
System.out.println("是否包含b: " + flag);
==> 打印結(jié)果:是否包含b: true
泛型
- 所謂的泛型就是在集合中指定存放的具體數(shù)據(jù)類型
Set<String> hs1 = new HashSet<String>();
這樣就只能存儲(chǔ)字符串String類型
Set<Integer> hs2 = new HashSet<Integer>();
這樣就只能存數(shù)字Integer類型
存儲(chǔ)高級(jí)數(shù)據(jù)無(wú)法去重
- Person類,Student類
Set hs3 = new HashSet();
Student s1 = new Student("s1", "101", 10);
Student s2 = new Student("s1", "101", 10);
Student s3 = new Student("s2", "102", 30);
hs3.add(s1);
hs3.add(s2);
hs3.add(s3);
for (Object a : hs3) {
System.out.println(a);
}
==> 打印結(jié)果
* Student [name=s1, className=101, score=10.0]
* Student [name=s2, className=102, score=30.0]
* Student [name=s1, className=101, score=10.0]
-
解決方法
我們需要在自定義類中左鍵生成hashcode() and equals() 方法。
image.png Student.java
public class Student {
String name;
String className;
float score;
public Student(String name, String className, float score) {
super();
this.name = name;
this.className = className;
this.score = score;
}
@Override
public String toString() {
return "Student [name=" + name + ", className=" + className + ", score=" + score + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((className == null) ? 0 : className.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + Float.floatToIntBits(score);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (className == null) {
if (other.className != null)
return false;
} else if (!className.equals(other.className))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (Float.floatToIntBits(score) != Float.floatToIntBits(other.score))
return false;
return true;
}
}
TreeSet
- 無(wú)序 (如果全是字母按照abcd排序,如果全是數(shù)字按照數(shù)字大小排序)
- 只能存貯可以相互比較大小的數(shù)據(jù)。
字母
Set ts1 = new TreeSet();
ts1.add("5");
ts1.add("99");
ts1.add("-1");
ts1.add("0.77");
ts1.add("0");
for(Object a : ts1) {
System.out.print(a + ",");
}
- 打印結(jié)果 : a,aa,bb,bbb,c,
數(shù)字
Set ts2 = new TreeSet();
ts2.add(5);
ts2.add(99);
ts2.add(-1);
ts2.add(77);
ts2.add(0);
for(Object b : ts2) {
System.out.print(b + ",");
}
- 打印結(jié)果 : -1,0,5,77,99,
自定義類 Person
class Person {
String name;
int age;
/**
* @param name
* @param age
*/
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
TreeSet 添加自定義類
Person p1 = new Person("瘋子", 18);
Person p2 = new Person("傻子", 98);
Set ts3 = new TreeSet();
ts3.add(p1);
ts3.add(p2);
for(Object person : ts3) {
System.out.println(person);
}
- 執(zhí)行結(jié)果:報(bào)錯(cuò) => Exception in thread "main" java.lang.ClassCastException: javaDemo3.Person cannot be cast to java.lang.Comparable
why? 因?yàn)樗麄兪菬o(wú)法比較大小的數(shù)據(jù)。
TreeSet添加對(duì)象使用Comparable接口
class PersonSet implements Comparable {
String name;
int age;
/**
* @param name
* @param age
*/
public PersonSet(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "PersonSet [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
}
- compareTo 是重點(diǎn)
PersonSet p1 = new PersonSet("瘋子", 18);
PersonSet p2 = new PersonSet("傻子", 98);
Set ts3 = new TreeSet();
ts3.add(p1);
ts3.add(p2);
for(Object person : ts3) {
System.out.println(person);
}
- 執(zhí)行上面的代碼打?。?PersonSet [name=瘋子, age=18]
- 只打印了一條,如何能存儲(chǔ)多個(gè)對(duì)象呢?
修改 PersonSet 的 compareTo 方法,手動(dòng)進(jìn)行比較。
class PersonSet implements Comparable {
String name;
int age;
/**
* @param name
* @param age
*/
public PersonSet(String name, int age) {
super();
this.name = name;
this.age = age;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
@Override
public String toString() {
return "PersonSet [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object o) {
// Object o 等于第二個(gè)對(duì)象
PersonSet person2 = (PersonSet) o;
int age1 = this.getAge(); // 第一個(gè)對(duì)象的age
int age2 = person2.getAge(); // 第二個(gè)對(duì)象的age
// 對(duì)比大小
if (age1 > age2) {
return 1;
} else if (age1 == age2) {
return 0;
} else {
return -1;
}
}
}
- 繼續(xù)執(zhí)行上面的代碼打印結(jié)果:
PersonSet [name=瘋子, age=18]
PersonSet [name=傻子, age=98]
