JAVA 데이터 구조의 HashSet 및 TreeSet 요약
Set은 같은 요소를 포함할 수 없습니다. 같은 두 요소를 같은 집합에 넣으려면dd 방법은false로 되돌아옵니다.
Set은 두 대상이 같다고 판단하는데 == 연산자가 아니라 equals 방법에 따른다.즉 두 대상이 equals 방법으로 비교해서true로 되돌아오기만 하면 Set는 이 두 대상을 받아들이지 않는다는 것이다.일반적으로 Set 인터페이스를 실현하는 종류는 HashSet과 TreeSet 두 가지가 있다.
Set (집합) 은 동적 수조와 다르다. (우리는 동적 수조를 대략적으로List로 볼 수 있다.) 동적 수조 안의 원소는 순서가 있고 집합 안에는 없기 때문에HashSet에는 get () 방법과 set () 방법이 없다.
HashSetHashSet은 산 목록의 형식으로 Set 인터페이스를 실현한다.
HashSet은 다음과 같은 특징을 가지고 있다
간단하게 말하면HashSet 집합이 두 대상의 상등을 판단하는 기준은 두 대상이 equals 방법을 통해 비교적 상등하고 두 대상의hashCode() 방법의 반환값이 상등하다는 것이다.
대상을 HashSet에 넣으려면 대상에 대응하는 클래스의 equals 방법을 다시 쓰고hashCode () 방법을 다시 써야 합니다.그 규칙은 두 대상이 equals 방법을 통해true로 되돌아갈 때hashCode도 같아야 한다는 것이다.또한 대상에서 equals 비교 표준으로 사용되는 속성은hashCode의 값을 계산하는 데 사용해야 한다.
객체의 유형이 JAVA 내부의 유형이라면 equals()와 hashCode() 방법을 다시 쓸 필요가 없습니다.만약 대상의 유형이 JAVA 내부의 유형이 아니라면 앞에서 언급한 두 가지 방법을 다시 써야 한다. 왜냐하면 JAVA 가상기는 사용자 정의 클래스의 대상의 내용을 어떻게 비교하는지 판단할 수 없기 때문이다.
예제 코드는 다음과 같습니다.
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){
return name + ":"+age;
}
public boolean equals(Object x){
if(x instanceof Person == false) return false;
Person p = (Person)x;
return this.name.equals(p.name)&&this.age == p.age;
}
public int hashCode(){
return name.hashCode() + age;
}
}
public class HashSetTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//
Set st = new HashSet();
st.add(new Person("zhang", 10));
st.add(new Person("li", 10));
st.add(new Person("zhang", 17));
st.add(new Person("zhang", 10));
System.out.println(st);
//JAVA
Set a = new HashSet();
a.add("abc");
a.add("xyz");
a.add("abc");
System.out.println(a);
}
}
추가LinkedHashSet 집합은 원소의hashCode 값에 따라 원소의 저장 위치를 결정하지만, 체인 테이블을 사용하여 원소의 순서를 유지합니다.이렇게 하면 원소가 삽입 순서로 저장된 것처럼 보입니다. 즉, 이 집합을 두루 돌아다닐 때LinkedHashSet은 원소의 추가 순서로 집합된 원소에 접근합니다.
LinkedHashSet은 Set의 모든 요소를 반복적으로 접근할 때 HashSet보다 성능이 좋지만 삽입할 때 성능은HashSet보다 약간 뒤떨어진다
TreeSet 클래스 TreeSet은SortedSet 인터페이스의 유일한 실현 클래스입니다. TreeSet은 집합 요소가 정렬된 상태를 확보할 수 있습니다.TreeSet은 두 가지 정렬 방식을 지원하는데, 자연 정렬과 사용자 정의 정렬이다. 그 중에서 자연 정렬은 기본적인 정렬 방식이다.TreeSet에 동일한 클래스의 객체가 포함되어야 합니다.TreeSet이 두 대상이 같지 않다고 판단하는 방식은 두 대상이 equals 방법으로false를 되돌려주거나CompareTo 방법으로 0을 되돌려받았는지 비교하는 것이다. 0을 되돌려주면 두 대상이 같다는 뜻이다.자연 정렬 자연 정렬은 정렬할 요소의 CompareTo(Object obj) 방법을 사용하여 요소 간의 크기 관계를 비교한 다음 오름차순으로 정렬합니다.자바는 Comparable 인터페이스를 제공합니다. 이 인터페이스에compareTo (Object obj) 방법이 정의되어 있습니다. 이 방법은 정수치를 되돌려 인터페이스의 대상이 크기를 비교할 수 있도록 합니다.obj1.compareTo(obj2) 방법은 0을 반환하면 비교된 두 대상이 같다는 것을 설명하고, 정수를 반환하면 obj1이 obj2보다 크고, 마이너스라면 obj1이 obj2보다 작다는 것을 의미한다.만약에 우리가 두 대상의 equals 방법을 항상true로 되돌려준다면 이 두 대상의compareTo 방법은 0 맞춤형 정렬을 되돌려야 한다. 자연 정렬은 집합 요소의 크기에 따라 승차순으로 배열하고 맞춤형 정렬을 하려면Comparator 인터페이스를 사용하여 intcompare(To1, To2) 방법을 실현해야 한다.
그렇다면 TreeSet은 어떤 방식으로 두 요소의 대상이 중복되는지 정의합니까?다음과 같은 두 가지 방법이 있습니다.
사용자 정의 클래스는Comparable 인터페이스를 실현한 다음CompareTo() 방법을 다시 작성합니다.
또 하나는 외부 심판을 초빙해 컴퍼니터 인터페이스를 실현하고 컴퍼니() 방법을 호출하는 것이다.
구현 인스턴스는 다음과 같습니다.
import java.util.*;
/*
class Person implements Comparable
{
private String name;
private int age;
public Person(String name, int age)
{
this.name = name;
this.age = age;
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
if (o instanceof Person == false) return 0;
Person p = (Person)o;
int t = this.name.compareTo(p.name);
if(t != 0)return t;
return this.age - p.age;
}
public String toString(){
return name + ":" + age;
}
}
*/
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name + ":" + age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
class K implements Comparator {
@Override
public int compare(Object a, Object b) {
// TODO Auto-generated method stub
if (a instanceof Person == false || b instanceof Person == false)
return 0;// a,b Person , , ,0
Person p1 = (Person) a;
Person p2 = (Person) b;
int t = p2.getName().compareTo(p2.getName());
if (t != 0) return t;
return p1.getAge() - p2.getAge();
}
}
public class TreeSetTEST {
public static void main(String[] args) {
// Set a = new TreeSet();
Set a = new TreeSet(new K());
a.add(new Person("hao", 10));
a.add(new Person("hao", 20));
a.add(new Person("hao", 30));
a.add(new Person("hao", 10));
a.add(new Person("zhang", 10));
a.add(new Person("zhang", 11));
a.add(new Person("zhang", 20));
a.add(new Person("li", 40));
System.out.println(a);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.