TreeSet的运用

/**
 * ArrayList LinkList HashSet TreeSet Comparator
 * ArrayList的ListIterator,equals(),get()
 * HashSet的hashCode()跟equals()
 * TreeSet如下例
 * HashSet TreeSet的两者比较方法
 * @author Administrator
 *
 */
class Person implements Comparable<Person>{
 private String name;
 private int age;
 
 Person(String name, int age) {
  this.name = name;
  this.age = age;
 }
 
 public String getName() {
  return name;
 }
 
 public int getAge() {
  return age;
 }
 
 public int compareTo(Person p) { //只能让事物本身具有比较性
  //Person p = (Person)obj;
  int num = new Integer(p.getAge()).compareTo(this.getAge()); //Integer 类重写了Oject的CompareTo()
  if (num==0)
   return p.getName().compareTo(this.getName());//String 类重写了Oject的CompareTo()
  return num;
 }
 /*public String toString() {
  return"name" + name + "age" + age;
 }*/

}

class Student extends Person{
 Student(String name, int age) {
  super(name,age);
 }
 
}
public class Text9 {
 public static void main(String args[]) {
  TreeSet<Student> t = new TreeSet<Student>(/*new Comparator<Person>() { //Comparator 比较器的参数可以是父类
   public int compare(Person p1,Person p2) {
    int num = new Integer(p1.getAge()).compareTo(p2.getAge()); //Integer 类重写了Oject的CompareTo()
    if (num==0)
     return p1.getName().compareTo(p2.getName());//String 类重写了Oject的CompareTo()
    return num;
   }
  }*/);
  
  t.add(new Student("hh",20));
  t.add(new Student("gg",20));
  t.add(new Student("hh",20));
  t.add(new Student("mm",34));
  
  Iterator<Student> i = t.iterator();
  
  while(i.hasNext()) {
   Student s = (Student)i.next();
   System.out.println(s.getName() + "...." + s.getAge());
  }
  
  //print(t);
 }
 //泛型的高级应用 厉害的用法,以后继续,<? extends Person>不能用于new()
 /*static public void print(TreeSet<? extends Person> t) {
  Iterator<? extends Person> it= t.iterator();
  while(it.hasNext()) {
   System.out.println(it.next());
  }
 }*/
 
 static public<T> void print(TreeSet<T> t) { //任意类型 Collection<T> t 容器都任意了
  Iterator<T> it = t.iterator();
  while(it.hasNext()) {
   System.out.println(it.next());
  }
 }

}
思考与感悟:

collectioin里面有两大分支,List 跟Set

list以下数组下标进行迭代。所以list的遍历比较高效。

Set是有比较的数组。HashSet是先进行hashCode()后,当结果相等时,进行equals()比较。当你要改变它的比较方式时,必须重载这两个函数。

TreeSet也是有比较的,但是除了一些JDK里面定义了的类之外。自定义的类必须让它本身具有比较性。不然TreeSet都不让你进。除了让对象本身具有比较性。也可以在列表初始化的时候加载一个比较器。注意的是,比较器的比较先进行,再到对象自己的比较。

还有就是泛型,一个我很陌生的玩意。但我觉得很好用。因为兼容性很强。无论实在函数还是类。它都可以决定你要处理的类的类型。真心不错。可惜我现在还没有用它的习惯。

 

 

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 *用TreeMap实现从一串字符数组中找出每个字母出现的次数
 * @author Administrator
 *
 */
public class Text11 {
 public static void paixu() {
  String str = "ahfijoaofefn";
  int i = 0,num = 0;
  
  char ch[] = str.toCharArray();
  TreeMap<Character,Integer> t = new TreeMap<Character,Integer>();
  
  while(i < ch.length) {
   if(!t.containsKey(ch[i]))
    t.put(ch[i], 1);
   else {
    num = t.get(ch[i]);
    t.put(ch[i], ++num);
   }
   i++;
   
  }
  //第一种遍历方法
  /*Set<Character> set = t.keySet();
  Iterator<Character> it = set.iterator();
  
  while(it.hasNext()) {
   char c = it.next();
   System.out.println("<" + c + "," + t.get(c) + ">");
  }*/
  //第二种遍历方法
  /*Set<Map.Entry<Character,Integer>> set = t.entrySet();
  Iterator<Map.Entry<Character,Integer>> it = set.iterator();
  while(it.hasNext()) {
   Map.Entry<Character,Integer> ety = it.next();
   System.out.println("<" + ety.getKey() + "," + ety.getValue() + ">");
  }*/
  //
  //第三种遍历方法
  Set<Map.Entry<Character,Integer>> set = t.entrySet();
  for(Map.Entry<Character,Integer> ety:set) {
   System.out.println("<" + ety.getKey() + "," + ety.getValue() + ">");
  }
 }
 
 public static void main(String args[]) {
  paixu();
 }
}

思考与感悟:

我为什么写了这段代码,是因为这两个遍历都不好记,所以才实现一遍。但是在Properties的时候会用到。这个属性类在往后写代码的时候很可能碰到。所以先练练。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐