TreeSet 및 Java 사용자 정의 유형 정렬
(무료 학습 권장 사항: 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>
첫 번째: 컬렉션에 배치된 요소는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!