2019独角兽企业重金招聘Python工程师标准>>>
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 duplicatesfill(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();elseit.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]
*/