java學(xué)習(xí)第十九章 集合之Set

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]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容