> Java > Java베이스 > 본문

Java 기본 TreeSet 및 Java 사용자 정의 유형 정렬

coldplay.xixi
풀어 주다: 2021-03-05 09:54:00
앞으로
2980명이 탐색했습니다.

Java 기본 TreeSet 및 Java 사용자 정의 유형 정렬

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>
로그인 후 복사

Java 기본 TreeSet 및 Java 사용자 정의 유형 정렬

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>
로그인 후 복사

Java 기본 TreeSet 및 Java 사용자 정의 유형 정렬
익명 내부 클래스 메소드를 사용할 수 있습니다 익명 내부 클래스 메소드를 사용할 수 있습니다(이 클래스에는 이름이 없으며 직접 새로운 인터페이스가 있습니다)

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 기본 TreeSet 및 Java 사용자 정의 유형 정렬

관련 학습 권장 사항: java 기본 사항

위 내용은 Java 기본 TreeSet 및 Java 사용자 정의 유형 정렬의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!