关于java容器使用和Comparator小程序

很长时间没写代码了,惭愧。身为java界的码畜,总认为手握屠龙刀就能号令天下,其实不然,屠龙宝刀里面的奥秘,还是深入挖掘。每一本武功秘籍都需要勤加修炼。不练就会忘记,大脑就是这样。

先说说容器吧,记得是有Collection和Map两大接口,实在是记不起来内部结构了,在net上弄了张图:


Collection:值允许每个位置上放一个对象,包括”按照一定顺序存放的一组对象“List;”只能添加不重复的对象“的Set;添加元素使用add();

Map:是键-值对的形式存在的,Map不接受重复的key值。添加元素使用put();

这些类都是存在 java.util.* 这个包下面的内容。值得一提的是存在一个Collections类,它包含有各种有关几何操作的静态方法,实现对各种集合的搜索、排序、线程安全化操作。

无论使用哪种Set,都需要定义equals(),但是只有在”要把对象放进”HashSet“的情况下,才需要定义HashCode();因为HashSet是我们常用的Set,所以通常也需要定义hashCode()。作为一种习惯,一般都会在重写equals()的同时也重写hashCode();

List主要分为:LinkedList、ArrayList、Vector;

ArrayList是一个用数组实现的List,能够进行快速的随机访问,但是往列表中间插入和删除元素的时候比较慢,允许null元素。

LinkedList是使用双向链表实现的,每个对象除了保存数据之外,还存储着前、后两个对象的reference,能够进行快速的插入和删除操作,允许null元素。

Vector是以前遗留下来的数据结构。

vector和ArrayList的区别:vector是线程安全、同步的;ArrayList是线程不安全、不是同步的;当容器满载时,vector增长为原数据容量的一倍;ArrayList增长原来的1/2;

关于List里面的方法,需要好好的去研究API;


Set主要分为:HashSet、TreeSet、LinkedHashSet;

Set的接口解释Collection,它不包含重复的元素;准确的说,Set中的equals方法被重写了,不满足e1.equals(e2),只能存在一个null值;

HashSet:是为了在大堆数据中查找而生的,比LinkedList快,比ArrayList方便(如果不知道下标);HashCode散列码,在Object中有一个hashCode方法得到散列码。基本上每一个对象都存在默认的散列码,也就是对象的内存地址。因为散列表的插入按照一定的方法(比如散列码除散列单元大小取余),知道怎么存储,查找起来就方便了。也就是说:HashCode()方法和equals()方法最好都同时重写!!

TreeSet:它的底层是一棵树,优势在于对元素排序,集合里面的元素为自然排序,不能出现重复元素;一般会通过实现Comparable接口来构建一个比较器,来对元素进行排序,compareTo(T t)方法。

LinkedHashSet:太高深,都在说源码。。。满头黑线,到时候在看。

Map分类:HashMap、TreeMap、LinkedHashMap、WeakHashMap、IdentityHashMap。

map主要增加了键-值关联,可以采用put(Obeject key, Object value)来增加元素,据说内部查找使用了hashcode(),这样的话,比ArrayList的一个一个查找要快。

HashMap:据说HashSet本身就是借由HashMap来实现的,底层都采用Hash存储机制。

TreeMap:TreeMap中所有元素都保持着某种固定的顺序,它实现了红黑树算法。如果想要一个有序的结果就用TreeMap(HashMap是无序的)。

可以看看别人写的http://cmsblogs.com/?p=1013。


关于Comparable接口和Comparator?

1>.一个类要是实现了Comparable接口,则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。

Comparable接口中只有一个compareTo()方法,例如:”a.x.compareTo(b.x)==0“就和equals()方法类似。

2>.Comparator是一种算法实现,假如一个类实现了这个接口,那么它一定要实现compareTo()方法,一般用在下面的情况:

1.类没有继承Comparable接口,但是又要进行类的比较的时候,我们可以通过Comparator来定义一个排序规则,而不必改变对象本身。

2.排序的标准多样化,升序、降序等等。

import java.util.*;

class Regular{
	String name;
	String sorted;
	public Regular() {}
	public Regular(String str){
		this.name = str;
		char[] sortChar = str.toCharArray();
		Arrays.sort(sortChar);
		String tmp = new String(sortChar);
		this.sorted = tmp;
	}
	public String getName() {
		return name;
	}
	public String getSorted() {
		return sorted;
	}
}


public class Main {
	static Comparator<Regular> comparator = new Comparator<Regular>(){
		public int compare(Regular str1,Regular str2){
			return str1.name.compareTo(str2.name);
		}
	};
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String tmp;
		ArrayList<Regular> rs = new ArrayList<Regular>();
		while(true){
			tmp = input.next();
			if(tmp.compareTo("XXXXXX")==0)break;
			Regular temp = new Regular(tmp);
			rs.add(temp);
		}
		Collections.sort(rs,comparator);
//		Iterable<Regular> it = rs.iterator();
//		System.out.println(rs);
		while(true){
			boolean flag = false;
			String tmp1 = input.next();
			if(tmp1.equals("XXXXXX"))break;
			Regular test = new Regular(tmp1);
			Iterator<Regular> it = rs.iterator();
			while(it.hasNext()){
				Regular tmp2=it.next();
				if(tmp2.getSorted().equals(test.getSorted())){
					flag=true;
					System.out.println(tmp2.getName());
				}
			}
			if(!flag)
				System.out.println("NOT A VALID WORD");
			System.out.println("******");
		}
	}
}

贴一个小例子,慢慢琢磨一下下。














  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值