TreeSet 및 Java 사용자 정의 유형 정렬
- TreeSet이 문자열을 정렬할 수 있음을 보여줌
- TreeSet이 사용자 정의 유형을 정렬할 수 없음
- 비교 규칙 작성 방법
- 자체 균형 이진 트리 구조
- 구현 비교기 인터페이스
- 컬렉션 도구 클래스
(무료 학습 권장 사항: java basic tutorial)
은 TreeSet이 문자열에 대해 정렬 가능함을 보여줍니다.
1. TreeMap 컬렉션의 맨 아래 레이어는 실제로 다음과 같습니다. TreeMap
2. TreeMap 컬렉션의 맨 아래 레이어는 이진 트리입니다.
3. TreeSet 컬렉션에 배치된 요소는 TreeMap 컬렉션의 핵심 부분에 배치된 것과 동일합니다.
4. TreeSet 컬렉션의 요소는 순서가 없습니다. 반복할 수는 없지만 요소에 따라 정렬할 수 있습니다. 크기 순서에 따른 자동 정렬
을 호출합니다: sortable collection
예: 데이터베이스에서 데이터를 검색하고 페이지에 사용자 정보를 표시하는 프로그램을 작성합니다. 생일의 오름차순 또는 내림차순,
이때는 TreeSet 컬렉션을 사용하면 되는데, TreeSet 컬렉션은 순서대로 넣고 빼기 때문입니다.
//创建一个TreeSet集合 TreeSet<string> ts=new TreeSet(); //添加Stringts.add("zhangsan");ts.add("lisi");ts.add("wangwu");ts.add("zhangsi");ts.add("wangliu");for(String s:ts){ //按照字典顺序排序 System.out.print(s+" "); } TreeSet<integer> ts2=new TreeSet();ts2.add(100);ts2.add(200);ts2.add(900);ts2.add(800); ts2.add(600);ts2.add(10);for(Integer i:ts2){ //按照升序排序 System.out.print(i+" ");}</integer></string>
TreeSet은 사용자 정의 유형을 정렬할 수 없습니다.
TreeSet은 사용자 정의 유형을 정렬할 수 있나요?
다음 프로그램에서는 Person 객체 간의 비교 규칙이 지정되지 않았기 때문에 Person 클래스를 정렬할 수 없습니다. 누가 더 나이 많고, 누가 더 어린지는 명시되어 있지 않습니다.
public class TreeSetTest02 { public static void main(String[] args) { Person p1=new Person(50); Person p2=new Person(10); Person p3=new Person(20); Person p4=new Person(60); Person p5=new Person(40); Person p6=new Person(30); TreeSet<person> persons=new TreeSet(); persons.add(p1); persons.add(p2); persons.add(p3); persons.add(p4); persons.add(p5); persons.add(p6); for(Person p:persons){ System.out.println(p); } }}class Person{ int age; public Person(int age){ this.age=age; } @Override public String toString() { return "Person [age=" + age + "]"; }}</person>
Exception in thread "main" java.lang.ClassCastException: testCollection.Person cannot be cast to java.lang.Comparable
이 오류가 발생하는 이유는
Person 클래스가 java.lang, Comparable 인터페이스를 구현하지 않기 때문입니다
//TreeSet 컬렉션에 배치된 요소는 java.lang.Comparable 인터페이스를 구현해야 합니다
//compareTo 메소드를 구현하면 equals는 쓸 필요가 없습니다.
public class TreeSetTest04 { public static void main(String[] args) { Customer p1=new Customer(50); Customer p2=new Customer(10); Customer p3=new Customer(20); Customer p4=new Customer(60); Customer p5=new Customer(40); Customer p6=new Customer(30); TreeSet<customer> customers=new TreeSet(); customers.add(p1); customers.add(p2); customers.add(p3); customers.add(p4); customers.add(p5); customers.add(p6); for(Customer p:customers){ System.out.println(p); } } } //放在TreeSet集合中的元素需要实现java.lang.Comparable接口//并且实现compareTo方法,equals可以不写 class Customer implements Comparable<customer>{ int age; public Customer(int age){ this.age=age; } @Override public String toString() { return "Customer [age=" + age + "]"; } //需要在这个方法中编写比较的逻辑,或者说比较的规则,按照什么进行比较。 //k.compareTo(t.key) //拿着参数k和集合中的每个k进行比较,返回值可能是>0,age2){// return 1;// }else{// return -1;// } return this.age-c.age; //>,<p>//이 메소드의 비교 논리나 비교 규칙, 그리고 무엇을 기준으로 비교할 것인지를 작성해야 합니다. <br> //k.compareTo(t.key)<br> //매개변수 k를 집합의 각 k와 비교합니다. 반환 값은 >0,비교 규칙은 여전히 다음으로 구현됩니다. 프로그래머: 예를 들어 나이순으로, 아니면 나이순으로<strong></strong></p> <p>비교규칙 작성방법<strong></strong></p>먼저 나이순으로, 나이가 같으면 이름오름차순으로<p> </p> <pre class="brush:php;toolbar:false">public class TreeSetTest05 { public static void main(String[] args) { TreeSet<vip> vips=new TreeSet(); vips.add(new Vip("zhangsi",20)); vips.add(new Vip("zhangsan",20)); vips.add(new Vip("king",18)); vips.add(new Vip("soft",17)); for(Vip vip:vips){ System.out.println(vip); } }}class Vip implements Comparable<vip>{ String name; int age; public Vip(String name,int age){ this.name=name; this.age=age; } @Override public String toString() { return "Vip [name=" + name + ", age=" + age + "]"; } //compareTo方法的返回值很重要: //返回0表示相同,value会覆盖 //>0,会继续在右子树上找 //<p>자기 균형 이진 트리 구조<strong></strong></p>1 .<p>자기 균형 이진 트리, 작은 왼쪽과 큰 오른쪽의 원리에 따라 저장됨<strong></strong> 2. 이진 트리를 순회하는 방법에는 세 가지가 있습니다<br> 사전 주문 순회 : 왼쪽 및 오른쪽 루트<br> 순차 순회: 왼쪽 및 오른쪽 루트<br> 후순 순회: 왼쪽 및 오른쪽 루트<br> 참고: 앞, 중간, 뒤는 루트의 위치를 나타냅니다<br> 3.<br>TreeSet 컬렉션 및 TreeMap 컬렉션은 순차 순회 방법, 즉 왼쪽 루트와 오른쪽을 사용합니다. 그들은 자체 균형 이진 트리입니다<strong></strong> 100 200 50 60 80 120 140 130 135 180 666<br></p> <p>비교기 인터페이스 구현<strong></strong></p> 비교기를 사용하여 TreeSet 컬렉션의 요소를 정렬하는 두 번째 방법<p></p> <pre class="brush:php;toolbar:false">public class TreeSetTest06 { public static void main(String[] args) { //创建TreeSet集合的时候,需要使用比较器 //TreeSet<wugui> wuGuis=new TreeSet(); //这样不行,没有通过构造方法传递一个比较器进去 TreeSet<wugui> wuGuis=new TreeSet(new WuguiComparator()); wuGuis.add(new Wugui(1000)); wuGuis.add(new Wugui(800)); wuGuis.add(new Wugui(900)); wuGuis.add(new Wugui(300)); wuGuis.add(new Wugui(60)); for(Wugui wugui:wuGuis){ System.out.println(wugui); } }}class Wugui{ int age; public Wugui(int age) { super(); this.age = age; } @Override public String toString() { return "Wugui [age=" + age + "]"; }}//单独再这里编写一个比较器//比较器实现java.util.Comparator接口(Comparable是java.lang包下的)class WuguiComparator implements Comparator<wugui>{ public int compare(Wugui o1,Wugui o2){ //指定比较规则 //按照年龄排序 return o1.age-o2.age; }}</wugui></wugui></wugui>
익명 내부 클래스 메소드를 사용할 수 있습니다 익명 내부 클래스 메소드를 사용할 수 있습니다(이 클래스에는 이름이 없으며 직접 새로운 인터페이스가 있습니다)
TreeSet<wugui> wuGuis=new TreeSet(new Comparator<wugui>(){public int compare(Wugui o1,Wugui o2){ //指定比较规则 //按照年龄排序 return o1.age-o2.age; }});</wugui></wugui>최종 결론은 TreeSet 또는 TreeMap의 핵심 부분에 배치된 요소라는 것입니다. 컬렉션은 두 가지 방법을 포함하여 정렬되어야 합니다
첫 번째: 컬렉션에 배치된 요소는 java.lang.Comparable 인터페이스를 구현합니다 두 번째: TreeSet 또는 TreeMap 컬렉션을 구성할 때 비교기 개체를 전달합니다.
비교 가능과 비교기 중에서 선택하는 방법은 무엇입니까?
비교 규칙이 변경되지 않거나 비교 규칙이 하나만 있는 경우 Comparable 인터페이스를 구현하는 것이 좋습니다.
비교 규칙이 여러 개 있고 여러 비교 규칙 간에 자주 전환해야 하는 경우 다음을 수행하는 것이 좋습니다. 비교기 인터페이스 사용
비교기 인터페이스의 디자인은 OCP 원칙을 준수합니다.
Collections 도구 클래스
java.util.Collections 컬렉션 도구 클래스, 컬렉션 작업을 용이하게 함
public class CollectionsTest { static class Wugui2 implements Comparable<wugui2>{ int age; public Wugui2(int age) { super(); this.age = age; } @Override public String toString() { return "Wugui2 [age=" + age + "]"; } @Override public int compareTo(Wugui2 o) { // TODO Auto-generated method stub return this.age-o.age; } } public static void main(String[] args) { //ArrayList集合不是线程安全的 List<string> list=new ArrayList<string>(); //变成线程安全的 Collections.synchronizedList(list); //排序 list.add("abc"); list.add("abe"); list.add("abd"); list.add("abf"); list.add("abn"); list.add("abm"); Collections.sort(list); for(String s:list){ System.out.println(s); } List<wugui2> wuguis=new ArrayList(); wuguis.add(new Wugui2(1000)); wuguis.add(new Wugui2(8000)); wuguis.add(new Wugui2(4000)); wuguis.add(new Wugui2(6000)); //注意:对list集合中元素排序,需要保证list集合中元素实现了Comparable接口 Collections.sort(wuguis); for(Wugui2 wugui:wuguis){ System.out.println(wugui); } //对set集合怎么排序呢 Set<string> set=new HashSet(); set.add("king"); set.add("kingsoft"); set.add("king2"); set.add("king1"); //将set集合转换成list集合 List<string> myList=new ArrayList(set); Collections.sort(myList); for(String s:myList){ System.out.println(s); } //这种方式也可以排序 //Collections.sort(list集合,比较器对象) }}</string></string></wugui2></string></string></wugui2>
관련 학습 권장 사항: java 기본 사항
위 내용은 Java 기본 TreeSet 및 Java 사용자 정의 유형 정렬의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
