import java.util.Set;
import java.util.*;class SetType
{
int i;
public SetType(int n){i = n;}
public boolean equals(Object o)
{
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 compareTo(TreeType arg)
{
return (arg.i < i ? -1:(arg.i == i ? 0 : 1));
}
}
public class SetTest
{
static <T> Set<T> fill(Set<T> set, Class<T> type)
{
try
{
for(int i = 0; i < 10; i++)
set.add(type.getConstructor(int.class).newInstance(i));
}
catch(Exception e){throw new RuntimeException(e);}
return set;
}
static <T> void test(Set<T> set,Class<T> type)
{
fill(set,type);
fill(set,type);
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);
//test(new TreeSet<SetType>(),SetType.class); 这里会报错,因SetType没实现comparable方法,不明白
TreeSet<SetType> setType = new TreeSet<SetType>(); //这样就可以使用<SetType>不理解 setType.add(new SetType(1));
System.out.println(setType);
}
}请高手指点下
import java.util.*;class SetType
{
int i;
public SetType(int n){i = n;}
public boolean equals(Object o)
{
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 compareTo(TreeType arg)
{
return (arg.i < i ? -1:(arg.i == i ? 0 : 1));
}
}
public class SetTest
{
static <T> Set<T> fill(Set<T> set, Class<T> type)
{
try
{
for(int i = 0; i < 10; i++)
set.add(type.getConstructor(int.class).newInstance(i));
}
catch(Exception e){throw new RuntimeException(e);}
return set;
}
static <T> void test(Set<T> set,Class<T> type)
{
fill(set,type);
fill(set,type);
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);
//test(new TreeSet<SetType>(),SetType.class); 这里会报错,因SetType没实现comparable方法,不明白
TreeSet<SetType> setType = new TreeSet<SetType>(); //这样就可以使用<SetType>不理解 setType.add(new SetType(1));
System.out.println(setType);
}
}请高手指点下
//照样报错
public static void main(String[] args)
{
//test(new HashSet<HashType>(),HashType.class);
//test(new LinkedHashSet<HashType>(),HashType.class);
//test(new TreeSet<TreeType>(),TreeType.class);
//test(new TreeSet<SetType>(),SetType.class); 这里会报错,因SetType没实现comparable方法,不明白
TreeSet<SetType> setType = new TreeSet<SetType>(); //这样就可以使用<SetType>不理解 setType.add(new SetType(1));//添加元素的时候要进行排序,不实现comparable是不可以的
setType.add(new SetType(1));
setType.add(new SetType(2));
//System.out.println(setType);
}
setType.add(new SetType(2));
像这样就会出错,而一个不会出的,那会是为什么,加一个时候不用调用Comparable()方法是不?
然后treeSet.add(1);treeSet.add(2);
这样写是怎样的解释??
SetType需要实现Comparable接口才可以,Integer已经实现了这个接口
往TreeSet里面添加数据的时候,会进行比较大小,因此,必须实现Comparable接口
首先,TreeSet 是 OrderedSet 子类型,也就是有排序的。
其实,对象类型“谁大谁小”先天上不具备像 int 这样的大小次序,需要我们告诉API 一个对象和同类型的另一个对象如何比较大小,所以,里面如果只有一个对象那没事,如果有多个就需要比较,然后排序。有上面两条就应该明白,为什么需要 Comparable 接口,而 TreeSet 为什么会报错。先看技术的使用,熟悉之后要看从概念上理清思路,这样才能更快地看懂别人的设计来了解更大型的软件,否则,很多的时间都是在琐碎的细节上纠缠不清。