Set類及子類:
TreeSet有序子類;
HashSet無序(散列)子類
HashSet子類的內容是沒有順序的,單個元素也不會重復的(對象除外)。
Set<String> allSet = new HashSet<String>();
allSet.add("a");
//重復數據
allSet.add("b");
allSet.add("b");
allSet.add("c");
allSet.add("d");
//重復數據
allSet.add("e");
allSet.add("e");
allSet.add("f");
System.out.println(allSet);
TreeSet有序:
TreeSet子類實現了SortSet子類(排序)接口,TreeSet接口是可以排序的。
向TreeSet類中添加自定義對象時,該自定義對象需要復寫Comparable接口中的CompareTo排序方法,否則會報:類轉換異常
java.lang.ClassCastException
可能需要在復寫toString()方法,否則打印的時候報錯:
[org.conllection.Person@139a55, org.conllection.Person@1db9742, org.conllection.Person@106d69c]
例如:
添加數據時,有一個自定義類:Person類,2個元素,Name(名字),age(年齡),如果用年齡排序,重復年齡會被剔除掉
person:
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = 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 "姓名:" + name + ", 年齡:" + age + "";
}
public int compareTo(Person o) {
// TODO 自動生成的方法存根
if(this.age > o.age)
{
return 1;
}else if(this.age < o.age)
{
return -1;
}else{
return 0;
}
}
}
setdemo2:
Set<Person> allSet = new TreeSet<Person>();
allSet.add(new Person("張三",30));
allSet.add(new Person("李四",30));
allSet.add(new Person("王五",31));
allSet.add(new Person("趙六",31));
allSet.add(new Person("田七",32));
System.out.println(allSet);
結果如下:
[姓名:張三, 年齡:30, 姓名:王五, 年齡:31, 姓名:田七, 年齡:32]
所以,應該在Comparable的CompareTo方法里面在判斷name是否重復。
修改后:
public int compareTo(Person o) {
// TODO 自動生成的方法存根
if(this.age > o.age)
{
return 1;
}else if(this.age < o.age)
{
return -1;
}else{
//如果age年齡相同需要在判斷name,是否重復
return this.name.compareTo( o.name );
}
}
結果如下:
[姓名:張三, 年齡:30, 姓名:李四, 年齡:30, 姓名:王五, 年齡:31, 姓名:趙六, 年齡:31, 姓名:田七, 年齡:32]
