文档章节

Set和存储顺序深入探讨、SortedSet排序的示例

猪刚烈
 猪刚烈
发布于 2014/08/16 09:34
字数 1088
阅读 11
收藏 0

Set和存储顺序深入探讨、SortedSet排序的示例

package org.rui.collection2.set;

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

//TypesForSets.java
/**
 * 下面演示了为了成功地使用特定的Set 实现类型而必须定义的方法
 * 
 * =================
 * 为了证明哪些方法对于某种特定的Set是必须需的,并且同时还要避免代码重复,
 * 我们创建了三个类。基类SetType只存储一个int,并且通过toString()方法产生它的值。
 * 因为所有在Set中存储的类都必须具有equals()方法,因此在基类中也有该方法。
 * 其等价性是基于这个int类型的i的值来确定的.
 * ================
 * HashType继承自SetType,并且添加了haseCode()方法 其等价性是基于这个int类型的i的值来确定的
 * =======================
 * TreeType实现了Comparable接口,如是一个对象被用于任何种类的排序容器中,
 * 例如 SortedSet(TreeSet是其唯一实现), 那么它必须实现这个接口,
 * 注意,在compareTo()中,我没有使用 "简洁明了" 的形式return i-i2,因为这是一个常 见的编程错误,
 * 它只有在i和i2都是无符号的int。。。。。。。。。。。。。。。
 *  你通常希望compareTo()方法可以产生与equals()方法一致的自然排序。如果equals()对于
 *  某个特定比较产生true,那么compareTo()对于该比较应该返回0
 *  如果equals()对于
 *  某个特定比较产生false,那么compareTo()对于该比较应该返回非0值
 *  ===================================
 *  在TypesForSets中,fill() 和test()方法都 是用泛型定义的,这是为了避免代码重复,
 *  为了验证某个set的行为 , test()会在被测Set上调用fill()三次,
 *  尝试着在其中引入重复对象。fill()方法可以接受任何类型的Set,
 *  以及相同类型Class对象,它使用Class对象来发现并接受int参数的构造器,然后调用构造器添加set中
 *  ==========================
 *  从输出中可以看到 HashSet以某种神秘的顺序保存所有的无素
 *  LinkedHashSet按照元素插入的顺序
 *  TreeSet 按照 排序。。。这里按照 compareTo()方式 维护的是降序
 * 
 * @author lenovo
 *
 */
class SetType
{
 int i;
 public SetType(int n){i=n;}
 
 public boolean equals(Object o)
 {
	 //对象相等并且 i值相等
	 return o instanceof SetType && (i==((SetType)o).i);
 }
 public String toString(){return Integer.toString(i);}
 
}

////////////////////////////////////////////////
class HashType extends SetType
{
    public HashType(int n){super(n);}
    
    public int hashCode(){return i;}
}
////////////////////////////////////////////////
class TreeType extends SetType implements Comparable<TreeType>
{
    public TreeType(int n){super(n);}
    
    public int hashCode(){return i;}
    
    public int compareTo(TreeType arg)
    {
    	return (arg.i<i?-1:(arg.i==i?0:1));
    }
    
}
////////////////////////////////////////////////
public class TypesForSets {
	static <T> Set<T> fill(Set<T> set,Class<T> type)
	{
		for(int i=0;i<10;i++)
		{
		  try {
			 set.add(
					 //通过构造器生成一个对象实例,
					type.getConstructor(int.class).newInstance(i)
					);
			} catch (Exception e) {
			  throw new RuntimeException(e);
			}
		}
		//set添加10个对象并返回
		return set;
	}

	static <T> void test(Set<T> set,Class<T> type)
	{
		fill(set,type);
		fill(set,type);//try to add duplicates
		fill(set,type);
		System.out.println(set);
	}
	
	public static void main(String[] args) {
		test(new HashSet<HashType>(),HashType.class);
		test(new LinkedHashSet<HashType>(),HashType.class);
		test(new TreeSet<TreeType>(),TreeType.class);
		//things that don't work 不工作的事情
		test(new HashSet<SetType>(),SetType.class);
		test(new HashSet<TreeType>(),TreeType.class);
		test(new LinkedHashSet<SetType>(),SetType.class);
		test(new LinkedHashSet<TreeType>(),TreeType.class);
		
		try {
			test(new TreeSet<SetType>(),SetType.class);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
		try {
			test(new TreeSet<HashType>(),HashType.class);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	
}
/**output:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[8, 2, 6, 3, 9, 7, 4, 6, 0, 5, 0, 3, 5, 0, 4, 1, 4, 2, 9, 6, 2, 1, 8, 3, 1, 7, 5, 9, 8, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
java.lang.ClassCastException: org.rui.generics.set.SetType cannot be cast to java.lang.Comparable
java.lang.ClassCastException: org.rui.generics.set.HashType cannot be cast to java.lang.Comparable

 */

package org.rui.collection2.set;

import java.util.Collections;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;

/**
 * SortedSet 排序状态 
 * Comparator comparator()返回当前Set使用的Comparator;或者返回null
 * SortedSet是按对象的比较函数对无素排序的
 * @author lenovo
 *
 */
public class SortedSetDemo 
{
	
	public static void main(String[] args) {
		SortedSet<String> sorted=new TreeSet<String>();
		Collections.addAll(sorted,"one two three four five six seven eight".split(" "));
		System.out.println(sorted);
		String low=sorted.first();
		String high=sorted.last();
		System.out.println(low);
		System.out.println(high);
		Iterator<String> it=sorted.iterator();
		for(int i=0;i<=6;i++)
		{
			if(i==3)low=it.next();
			if(i==6) high=it.next();
			else
				it.next();
		}
		System.out.println(low);
		System.out.println(high);
		System.out.println(sorted.subSet(low,high));
		System.out.println(sorted.headSet(high));//小于 ToElement元素的组成
		System.out.println(sorted.tailSet(low));//大于等于
	}

}
/**output:
[eight, five, four, one, seven, six, three, two]
eight
two
one
two
[one, seven, six, three]
[eight, five, four, one, seven, six, three]
[one, seven, six, three, two]
*/


本文转载自:http://blog.csdn.net/liangrui1988/article/details/30112197

猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
List/Set/Map集合排序/有序集合

其中 Set代表无序、不可重复的集合; List代表有序、重复的集合; Map则代表具有映射关系的集合。 Queue体系集合代表一种队列集合实现。 使用Collections.sort对List集合排序 Collections.so...

秋风醉了
2014/09/11
513
0
java集合框架总结(五)

一、Set接口 概述 Set 接口继承 Collection 接口,而且它不允许集合中存在重复项,每个具体的 Set 实现类 依赖添加的对象的 equals()方法来检查独一性。Set接口没有引入新方法,所以Set就是一...

hapier
2016/09/08
35
0
Java集合 (SortedSet)

java.util.SortedSet接口是java.util.Set接口的一个子接口。处了元素顺序由 自身内部进行排序外其它与Set行为一致(可以说在Set基础上增加自身排序功能) 默认该排序是由自身内部的自然排序(...

Kevin-air
2014/01/07
69
0
Java中的Set集合

Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合里面,则添加操作失败,add()方法返回false,且新元素不会被添加入。 1.HashSet是Set的接口的典型实现,大多数时...

西红柿的眼泪
2016/07/13
68
0
list map set总结

括号为是否线程安全 list: LinkedList(no) ArrayList(no) Vector(yes) Stack(yes) map: HashMap(no) LinkedHashMap(no) HashTable(yes) WeakHashMap TreeMap set: HashSet(no) LinkedHashSet......

五大三粗
2015/07/23
44
0

没有更多内容

加载失败,请刷新页面

加载更多

Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
6
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部