知识点:各种容器介绍(示例为TreeSet),TreeSet的遍历
/** * ArrayList LinkList HashSet TreeSet Comparator * ArrayList的ListIterator,equals(),get() * HashSet的hashCode()跟equals() * TreeSet如下例 * HashSet TreeSet的两者比较方法 * @author Administrator *
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的时候会用到。这个属性类在往后写代码的时候很可能碰到。所以先练练。
更多推荐
所有评论(0)