Set 인터페이스 구현 클래스

14611 단어

클래스 HashSet 구현


//******************************HashSet에 사용자 정의 객체 추가
public class Student {
    private int age;
    private String name;
    // get/set 
    public Student(int age,String name){
        this.age = age;
        this.name = name;
    }
    // Student , toString 
    public String toString(){
        return "age:"+age+"name:"+name;
    }
    // Java , equals() , hashCode() 
    // equals , true, hashCode 。
    public int hashCode(){
        return age*name.hashCode();
    }
    //HashSet hashCode() equals() 

    @Override
    public boolean equals(Object obj) {
        Student s = (Student)obj;           // 
        return age==s.age && name.equals(s.name);
    }
}

주석:


Set 집합에 중복된 요소를 추가할 수 없기 때문에 사용자 정의 클래스에 대해 어떻게 중복된 요소를 계산할 수 있는지 판단하는 방법을 제공해야 한다.코드의hashCode()와 equals() 방법은 Student 대상이 중복 대상인지 아닌지를 판단하는 표준 방법이다.만약 두 대상이 같다면, 그들의 hashCode 값은 반드시 같을 것이다.
import java.util.HashSet;
import java.util.Iterator;

public class SelfHashSetTest {
    public static void main(String args[]){
        HashSet hs = new HashSet();
        // 
        hs.add(new Student(28,"zah"));
        hs.add(new Student(31,"xmh"));
        hs.add(new Student(30,"zyj"));
        // 
        hs.add(new Student(28,"zah"));
        hs.add(new Student(31,"xmh"));
        // null 
        hs.add(null);
        hs.add(null);
        // 
        Iterator it = hs.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

실행 결과

null
age:31name:xmh
age:33name:zxx
age:30name:zyj
age:28name:zah

실행 결과에 의하면 HashSet은 null 요소를 추가할 수 있지만 중복된 요소는 하나만 추가할 수 있습니다.

클래스 LinkedHashSet 구현


링크드 HashSet 클래스는 원소의 해시에 따라 저장하고 체인표로 원소의 가입 순서를 기록합니다.
public class Student {
    private int age;
    private String name;
    // get/set 
    public Student(int age,String name){
        this.age = age;
        this.name = name;
    }
    // Student , toString 
    public String toString(){
        return "age:"+age+"name:"+name;
    }
    // Java , equals() , hashCode() 
    // equals , true, hashCode 。
    public int hashCode(){
        return age*name.hashCode();
    }
    //HashSet hashCode() equals() 

    @Override
    public boolean equals(Object obj) {
        Student s = (Student)obj;           // 
        return age==s.age && name.equals(s.name);
    }
}
import java.util.Iterator;
import java.util.Set;
import java.util.LinkedHashSet;
public class LinkedHashSetTest {
    public static void main(String args[]){
        Set linkHashSet = new LinkedHashSet();
        Student stu1 = new Student(18,"zxx");
        Student stu2 = new Student(23,"zyj");
        Student stu3 = new Student(25,"xmh");
        Student stu4 = new Student(25,"zah");
        Student stu5 = new Student(25,"zah");
        linkHashSet.add(stu3);
        linkHashSet.add(stu4);
        linkHashSet.add(stu1);
        // HashCode , 
        linkHashSet.add(stu2);
        linkHashSet.add(stu5);
        linkHashSet.add(null);
        Iterator it = linkHashSet.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

실행 결과

age:25name:xmh
age:25name:zah
age:18name:zxx
age:23name:zyj
null

Process finished with exit code 0

참고:


체인 테이블을 통해 대상을 저장하는데 일반적으로 삽입과 삭제 효율이 비교적 높고 검색 효율이 상대적으로 낮다.

구현 클래스 TreeSet

public class Student1 {
    private Integer age;
    private String name;
    private Integer score;

    Student1(int age,String name,int score){
        this.age = age;
        this.name = name;
        this.score = score;
    }

    public String toString(){
        return "age:"+age+"name:"+name+"score:"+score;
    }

    public int hashCode(){
        return age*name.hashCode();
    }

    public boolean equals(Object o){
        Student1 s = (Student1)o;
        return age==s.age && name.equals(s.name);
    }

    public int getAge() {
        return age;
    }

    public Integer getScore() {
        return score;
    }
}
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

// class
class StudentAgeComparetor implements Comparator<Student1> {

    @Override
    public int compare(Student1 o1, Student1 o2) {
        int i = o2.getAge()-o1.getAge();
        return i;
    }
}

// class
class StudentScoreComparator implements Comparator<Student1> {

    @Override
    public int compare(Student1 o1, Student1 o2) {
        int i = (int) (o2.getScore()-o1.getScore());
        return i;
    }
}

public class SelfTreeSetTest {
    public static void main(String args[]){
        // TreeSet 
        Set ts = new TreeSet(new StudentAgeComparetor());
        Student1 stu1 = new Student1(18,"zxx",85);
        Student1 stu2 = new Student1(23,"zyj",81);
        Student1 stu3 = new Student1(26,"xmh",92);
        Student1 stu4 = new Student1(25,"zah",76);
        ts.add(stu3);
        ts.add(stu4);
        ts.add(stu1);
        ts.add(stu2);
        Iterator it = ts.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }


    }
}

실행 결과

age:26name:xmhscore:92
age:25name:zahscore:76
age:23name:zyjscore:81
age:18name:zxxscore:85

Process finished with exit code 0


참고:


점수 선택기를 선택하면 코드 Set ts = new TreeSet (new Student Age Comparetor () 를 Set ts = new TreeSet (new Student Score Comparetor () 로 변경하면 됩니다.

좋은 웹페이지 즐겨찾기