자바 중복 데 이 터 를 제거 하 는 방법 에 대한 자세 한 설명 (전환)
4102 단어 데이터 구조 입문
본 고 는 자바 가 배열 을 실현 하여 중복 데 이 터 를 제거 하 는 방법 을 실례 로 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다. 구체 적 으로 는 다음 과 같 습 니 다.
얼마 전 면접 에서 한 배열 에 중복 요소 가 있다 면 어떤 방법 으로 무 게 를 줄 수 있 느 냐 는 질문 을 받 았 다.한 시간 에 한 가지 방법 을 생각 할 수 있 지만 나중에 자 료 를 찾 아 보 니 실현 할 수 있 는 방법 이 많다 는 것 을 알 게 되 었 습 니 다. 지금 바로 정리 해 보 겠 습 니 다. 비교적 간단 한 몇 가지 방법 이 있 습 니 다.
List 집합 으로 구현
int[] str = {5, 6, 6, 6, 8, 8, 7,4};
List list = new ArrayList();
for (int i=0; i
출력 결 과 는:
list [5, 6, 8, 7, 4]
중 복 된 요 소 를 제거 할 수 있 지만 정렬 기능 이 구현 되 지 않 았 습 니 다.
2. hashSet 또는 TreeSet 로 구현
Integer[] nums = { 5, 5, 6, 6, 6, 8, 8, 7, 11, 12, 12 };
// HashSet hset = new HashSet(Arrays.asList(nums));
TreeSet hset = new TreeSet(Arrays.asList(nums));
Iterator i = hset.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
출력 결과:
5 6 7 8 11 12
중복 데 이 터 를 제거 할 뿐만 아니 라 데 이 터 를 정렬 한 것 을 볼 수 있다.
그 중에서
Arrays.asList()
은 하나의 배열 을 하나의 List 대상 으로 바 꾸 는 것 입 니 다. 이 방법 은 Array List 형식의 대상 을 되 돌려 줍 니 다. 이 Array List 류 는 자바 util. Array List 류 가 아니 라 Arrays 류 의 정적 내부 류 입 니 다!TreeSet 은 요 소 를 중복 하지 않 을 뿐만 아니 라 정렬 등 기능 의 집합 을 실현 할 수 있 으 며 대상 요소 가 집합 에 추 가 될 때 특정한 비교 규칙 에 따라 질서 있 는 대상 서열 에 자동 으로 삽입 합 니 다.
3. List 와 set (집합) 로 실현
int[] nums = { 5, 6, 6, 6, 8, 8, 7 };
List numList = new ArrayList();
for (int i : nums)
numList.add(i);
Set numSet = new HashSet();
numSet.addAll(numList);
System.out.println(numSet);
출력 결과:
[5, 6, 7, 8]
중 복 된 데 이 터 를 제거 하고 정렬 을 한 것 으로 보인다.
HashSet 과 TreeSet 의 비 교 를 해 보 겠 습 니 다.
HashSet
HashSet 은 다음 과 같은 특징 이 있 습 니 다.
1) 요소 의 배열 순 서 를 보장 할 수 없고 순서 가 변 할 수 있 습 니 다. 2) 동기 화 되 지 않 은 3) 집합 요 소 는 null 일 수 있 지만 하나의 null 만 넣 을 수 있 습 니 다.
HashSet 집합 에 요 소 를 저장 할 때 HashSet 은 대상 의 hashCode () 방법 으로 대상 의 hashCode 값 을 얻 은 다음 hashCode 값 에 따라 대상 이 HashSet 에 저 장 된 위 치 를 결정 합 니 다.
쉽게 말 하면 HashSet 집합 은 두 요소 가 같다 고 판단 하 는 기준 은 두 대상 이 equals 방법 을 통 해 서로 같 고 두 대상 의 hashCode () 방법 이 값 을 되 돌려 주 는 것 이다.
한 대상 을 HashSet 에 넣 으 려 면 해당 대상 이 대응 하 는 equals 방법 을 다시 쓰 고 hashCode () 방법 을 다시 써 야 합 니 다.그 규칙 은 두 대상 이 equals 방법 을 통 해 true 로 되 돌아 갈 때 hashCode 도 같 아야 한 다 는 것 이다.또한 대상 에서 equals 비교 표준 속성 으로 사용 되 며 hashCode 의 값 을 계산 해 야 합 니 다.
TreeSet 클래스
TreeSet 은 SortedSet 인터페이스의 유일한 실현 클래스 로 TreeSet 은 집합 요소 가 정렬 상태 에 있 는 지 확인 할 수 있 습 니 다.
TreeSet 은 두 가지 정렬 방식 의 자연 정렬 과 맞 춤 형 정렬 을 지원 합 니 다. 그 중에서 자연 정렬 은 기본 정렬 방식 입 니 다.TreeSet 에 추 가 된 것 은 같은 종류의 대상 일 것 입 니 다.
TreeSet 에서 두 대상 이 서로 다르다 고 판단 하 는 방식 은 두 대상 이 equals 방법 으로 false 로 되 돌아 가 거나 CompareTo 방법 을 통 해 0 으로 되 돌아 가지 않 았 다 는 것 이다.
자연 정렬
자연 정렬 은 정렬 할 요소 의 CompareTo (Object obj) 방법 을 사용 하여 요소 간 의 크기 관 계 를 비교 한 다음 에 요 소 를 오름차 순 으로 배열 합 니 다.
자바 는 Comparable 인 터 페 이 스 를 제공 합 니 다. 이 인터페이스 에서 compare To (Object obj) 방법 을 정 의 했 습 니 다. 이 방법 은 전체 수 치 를 되 돌려 이 인터페이스의 대상 을 비교 할 수 있 습 니 다.
obj 1. compare To (obj 2) 방법 이 0 을 되 돌려 주면 비 교 된 두 대상 이 같다 는 것 을 설명 하고, 정 수 를 되 돌려 주면 obj 1 이 obj 2 보다 크 고, 음수 라면 obj 1 이 obj 2 보다 작 다 는 것 을 나타 낸다.
만약 우리 가 두 대상 의 equals 방법 을 항상 true 로 되 돌려 준다 면, 이 두 대상 의 compare To 방법 은 0 으로 되 돌아 가 야 합 니 다.
맞 춤 형 정렬
자연 정렬 은 집합 요소 의 크기 에 따라 오름차 순 으로 배열 되 며, 정렬 을 맞 추 려 면 Comparator 인 터 페 이 스 를 사용 하여 int compare (T o1, T o2) 방법 을 실현 해 야 합 니 다.
가장 중요 한 것:
1. TreeSet 은 이 진 트 리 로 이 루어 집 니 다. Treeset 의 데 이 터 는 자동 으로 정렬 되 어 있 으 며 null 값 을 넣 을 수 없습니다.
2. HashSet 은 해시 표 에서 이 루어 진 것 입 니 다. HashSet 의 데 이 터 는 무질서 합 니 다. null 을 넣 을 수 있 지만 하나의 null 만 넣 을 수 있 습 니 다. 둘 중의 값 은 중복 되 지 않 습 니 다. 예 를 들 어 데이터 베이스 에서 유일한 제약 과 같 습 니 다.
3. HashSet 이 넣 으 라 고 요구 한 대상 은 반드시 HashCode () 방법 을 실현 해 야 한다. 넣 은 대상 은 hashcode 코드 를 표지 로 하고 같은 내용 을 가 진 String 대상 은 hashcode 가 같 기 때문에 넣 은 내용 은 중복 할 수 없다.그러나 같은 종류의 대상 은 다른 실례 를 넣 을 수 있다.