黑马程序员技术交流社区
标题:
ArrayList和TreeSet疑问!!!!
[打印本页]
作者:
赵家阳
时间:
2012-12-9 16:37
标题:
ArrayList和TreeSet疑问!!!!
import java.util.*;
public class GenericDemoT {
public static void main(String[] args)
{
//ArrayList<String> a1 = new ArrayList<String>(new MyLenCom()); //代码1
TreeSet<String> a1 = new TreeSet<String>(new MyLenCom()); //代码2
//<String>代表要村的元素的类型
a1.add("abcd2");
a1.add("aadc");
a1.add("cdfgd2");
a1.add("123");
a1.add(",..,m,");
Iterator<String> it = a1.iterator();
while(it.hasNext())
{
String s = it.next();
System.out.println(s+"....."+s.length());
}
}
}
class MyLenCom implements Comparator
{
public int compare(Object o1,Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num ==0)
{
return s1.compareTo(s2);
}
return num;
}
}
复制代码
疑问:为什么代码2能编译通过,而代码1就不能?ArrayList和TreeSet在这一点有什么区别?
作者:
杨永胜
时间:
2012-12-9 17:04
ArrayList没有带比较器的构造方法,TreeSet就有,这个可以从API里面查到;其根本的区别就是List是有序的,这个有序是按照存的顺序而言,而且元素是可以重复的(没办法进行比较),set则是不允许重复,而且是原本无序的,可以加进比较器排序
作者:
赵保磊
时间:
2012-12-9 17:12
只有类提供了这个构造方法才能new 对象,而ArrayList没有提供,所以ArrayList不具备自定义比较器的方法。
TreeSet是二叉树数据结构,存储在Set中的元素不允许重复,而且TreeSet具有按字母顺序排序的功能。如果不是我们所想要的可以自定义比较器。
就是让自定义的比较了实现Comparator父类,并且重写其compare比较方法。
作者:
洪灿阳
时间:
2012-12-9 18:04
在java基础中只有说到对set进行排序用这种做法,但并没有提到对于list集合,这种方式也可行的,我觉得应该是list和set集合之间的不同之处导致的,比如说,set存在唯一性的元素,无序,但是list是有序的,元素可以重复的。但是我们也可以通过自定义实现larrayist的排序,通过转变成数组,再排序实现的排序方式,如果要实现唯一性的话,可以自己再加点判断就行了。下面是我的代码。
package cn.itcast.Test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> arr=new ArrayList<String>();
arr.add("aaa");
arr.add("abc");
arr.add("aba");
arr.add("a");
arr.add("bbbaa");
arr.add("aab");
arr.add("baa");
arr.add("aaaaa");
arr.add("aaa");
Object[] array = arr.toArray();
sort(array);
Iterator it = arr.iterator();
while(it.hasNext()){
Object o1=it.next();
System.out.println(o1.toString());
}
System.out.println("-------------after sort-------------");
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}
private static void sort(Object[] array) {
// TODO Auto-generated method stub
for(int i=0;i<array.length-1;i++){
for(int j=i+1;j<array.length;j++){
compare(array,i,j);
}
}
}
private static void compare(Object[] array, int i, int j) {
// TODO Auto-generated method stub
String a1=(String)array[i];
String a2=(String)array[j];
if(a1.length()>a2.length()){
String temp=(String)array[i];
array[i]=array[j];
array[j]=temp;
}
if(a1.length()==a2.length()){
System.out.println(a1+" "+a2);
System.out.println(a1.compareTo(a2));
if(a1.compareTo(a2)>0){
String temp=(String)array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
}
复制代码
作者:
Rancho_Gump
时间:
2012-12-9 18:10
我截了个API的图,可以看到ArrayList没有传比较器的构造方法,因为List集合本身是有序的,所以这个是没有必要的。如果想按自己的规则排序可以通过复写类中的equals()方法
1.jpg
(457.13 KB, 下载次数: 49)
下载附件
2012-12-9 17:59 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2