JavaSE-day17-集合-TreeSet

1.基于二叉树,不同步。

 2. TreeSet 会对元素进行自然顺序排序

package day18;
import java.util.Iterator;
import java.util.TreeSet;
/**
 * Created by zengjx on 2019/5/24.
 */
public class TreeSetDemo {
    public  static  void main(String[]  args){
       treeSet1();
    }
    public  static    void  treeSet1(){
     TreeSet tree=  new TreeSet();
        tree.add("abc");
        tree.add("ddd");
        tree.add("ccc");
        tree.add("aba");

        Iterator it= tree.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
        /**
         * aba
          abc
          ccc
          ddd
         */
    }
}

 3.对自定义对象进行排序。

自定义Person 类 ,默认是继承Object 类。  TreeSet 进行 add(new Person(" aaa",1)) ; 再次  add(new Person("bbb",2)) ;时候会进行强制排序。:会出现报错。

 

 解决问题方法:Person   implements   Comparable,判断元素是否相同

TreeSet 不看HashCode 和equals ,只看comareTo返回值。

package day18;
import tree.Tree;

import java.io.StringReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
/**
 * Created by zengjx on 2019/5/23.
 */
class Human {
    String name ;
    int  age;
    Human(String   name,int age){
       this.age=age;
        this.name=name;
    }

    static   class  Comp implements  Comparator{

        @Override
        public int compare(Object o1, Object o2) {
            Human  human1=(Human)o1;
            Human  human2= (Human)o2;
            int result= human1.age>human2.age ? 1:(human1.age==human2.age? 0:-1);
            if(result==0){
                result=human1.name.compareTo(human2.name);
            }
            return result;
        }
    }
}




class  Person  implements Comparable {
    public String   name;
    public   int age;
    Person(String  name,int age){
        this.age=age;
        this.name=name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public String getName() {
        return name;
    }

    @Override
    public int compareTo(Object o) {
        Person  per=(Person)o;
        //升序   比较对象与指定对象的顺序,如果该对象小于 等于或者大于指定对象分别返回负整数,零,正整数。
     return    this.age<per.age? -1: (this.age== per.age  )? 0: 1;
      //降序排列
      // return  this.age <per.age ?1:(this.age==per.age    )? 0:-1;

    }
}
public class TreeDemo1 {

    public   static  void  main(String[] args){

        sortTest2();//    sortTest();

    }
   public static   void test1(){
        TreeSet  treeSet =new TreeSet();
        treeSet.add(new Person("川普1",1));
        treeSet.add(new Person("川普2",2));
        treeSet.add(new Person("川普3",3));
        treeSet.add(new Person("川普4",4));
        Iterator   iterator  =treeSet.iterator();
        while(iterator.hasNext()){
            Person per=(Person)iterator.next();
            System.out.println(" "+per.name+" "+per.age);
        }


    }

    public  static  void   test2(){
      TreeSet   treeSet =new TreeSet(new Human.Comp());
        treeSet.add(new Human("特蕾莎1",1));
        treeSet.add(new Human("特蕾莎2",2));
        treeSet.add(new Human("特蕾莎3",3));
        treeSet.add(new Human("特蕾莎4",4));

        Iterator   iterator  =treeSet.iterator();
        while(iterator.hasNext()){
            Human human=(Human) iterator.next();
            System.out.println(" "+human.name+" "+human.age);
        }

    }
     public  static   void  sortTest(){
      String  str="45, 46, 67,  78,  -12";
      String[] strArray=str.split(", "+"+");//ree
          TreeSet   treeSet =new TreeSet();
         for(int   i=0;i<strArray.length;i++){
             treeSet.add(  Integer.parseInt(strArray[i]));
         }
         Iterator  iterator =treeSet.iterator();
      while(iterator.hasNext()){
          System.out.println(" "+iterator.next());
      }

     }
    //使用Arrays.sort排序
    public  static   void  sortTest2(){
        String  str="45, 46, 67,  78,  -12";
        String[] strArray=str.split(", "+"+");//ree
         int[] intArray= new int[strArray.length];
        for(int i=0;i<intArray.length;i++){
            intArray[i] = Integer.parseInt(strArray[i]);
        }
        Arrays.sort(intArray);
        for(int i: intArray){
            System.out.println("排序后"+i);
        }

    }


}

 

package day18;

public class TreePerson    implements  Comparable{

    String  name;
    int   age;
    TreePerson(String  name,int age){
        this.age=age;
        this.name=name;

    }
   //第一种 只是返回0 ,插入第一个元素后第二个元素开始调用 compareTo 进行比较返回  0所以后面元素都不会插入。

  /*  @Override
    public int compareTo(Object o) {
        return 0; //第一种
    }*/

    @Override
    public int compareTo(Object o) {

     TreePerson  treePerson =(TreePerson)o;
     int temp=this.age-treePerson.age;
     System.out.println(" temp="+temp);
     System.out.println(" 当前对象"+this +" 传入对象"+treePerson);
        return temp; //第一种
    }

    @Override
    public String toString() {
        return " this :"+this.name+" age "+this.age;
    }
}

/**
 *  temp=0
 *  当前对象 this :aaaa age 28 传入对象 this :aaaa age 28
 *  temp=-7
 *  当前对象 this :bbbb age 21 传入对象 this :aaaa age 28
 *  temp=1
 *  当前对象 this :ccccc age 29 传入对象 this :aaaa age 28
 *  temp=2
 *  当前对象 this :cdddd age 30 传入对象 this :aaaa age 28
 *  temp=1
 *  当前对象 this :cdddd age 30 传入对象 this :ccccc age 29
 *  temp=0
 *  当前对象 this :aaa age 28 传入对象 this :aaaa age 28
 * bbbb --21
 * aaaa --28
 * ccccc --29
 * cdddd --30
 */

 练习2:按照字符串长度对字符串长度排序。

package day18;
import java.util.Comparator;
public class CompareByLength  implements Comparator {
    @Override
    public int compare(Object o, Object t1) {
      String  s1=(String) o;
      String  s2=(String)t1;
      int  temp= s1.length()-s2.length();
        return temp ==0 ? (s1.compareTo(s2)) :temp;//这一一句是 如果字符串长度相同。
    }
}
//对字符串进行长度排序
public   static  void  test2(){
TreeSet  treeSet = new TreeSet(new CompareByLength());
treeSet.add("aaaa");
treeSet.add("aaab");
treeSet.add("qqqqqqqq");
treeSet.add("www");
treeSet.add("ddddddddddd");
Iterator  iterator=treeSet.iterator();
while(iterator.hasNext()){
  System.out.println(iterator.next());
}
}

www
aaaa
aaab
qqqqqqqq
ddddddddddd
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值