A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵家阳 中级黑马   /  2012-12-9 16:37  /  2247 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.*;
  2. public class GenericDemoT {
  3.         public static void main(String[] args)
  4.         {
  5.                 //ArrayList<String> a1 = new ArrayList<String>(new MyLenCom());     //代码1
  6.                 TreeSet<String> a1 = new TreeSet<String>(new MyLenCom());          //代码2
  7.                 //<String>代表要村的元素的类型
  8.                 a1.add("abcd2");
  9.                 a1.add("aadc");
  10.                 a1.add("cdfgd2");
  11.                 a1.add("123");
  12.                 a1.add(",..,m,");
  13.                
  14.                 Iterator<String> it = a1.iterator();
  15.                 while(it.hasNext())
  16.                 {
  17.                         String s = it.next();
  18.                         System.out.println(s+"....."+s.length());
  19.                 }
  20.                
  21.         }
  22. }
  23. class MyLenCom implements Comparator
  24. {
  25.         public int compare(Object o1,Object o2)
  26.         {
  27.                 String s1 = (String)o1;
  28.                 String s2 = (String)o2;
  29.                
  30.                 int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
  31.                 if(num ==0)
  32.                 {
  33.                         return s1.compareTo(s2);
  34.                 }
  35.                 return num;
  36.         }
  37. }
复制代码
疑问:为什么代码2能编译通过,而代码1就不能?ArrayList和TreeSet在这一点有什么区别?

4 个回复

正序浏览
我截了个API的图,可以看到ArrayList没有传比较器的构造方法,因为List集合本身是有序的,所以这个是没有必要的。如果想按自己的规则排序可以通过复写类中的equals()方法

1.jpg (457.13 KB, 下载次数: 55)

1.jpg
回复 使用道具 举报
在java基础中只有说到对set进行排序用这种做法,但并没有提到对于list集合,这种方式也可行的,我觉得应该是list和set集合之间的不同之处导致的,比如说,set存在唯一性的元素,无序,但是list是有序的,元素可以重复的。但是我们也可以通过自定义实现larrayist的排序,通过转变成数组,再排序实现的排序方式,如果要实现唯一性的话,可以自己再加点判断就行了。下面是我的代码。
  1. package cn.itcast.Test;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;

  5. public class ArrayListTest {

  6.         /**
  7.          * @param args
  8.          */
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub

  11.                 List<String> arr=new ArrayList<String>();
  12.                 arr.add("aaa");
  13.                 arr.add("abc");
  14.                 arr.add("aba");
  15.                 arr.add("a");
  16.                 arr.add("bbbaa");
  17.                 arr.add("aab");
  18.                 arr.add("baa");
  19.                 arr.add("aaaaa");
  20.                 arr.add("aaa");
  21.                
  22.                 Object[] array = arr.toArray();

  23.                 sort(array);
  24.                
  25.                 Iterator it = arr.iterator();
  26.                 while(it.hasNext()){
  27.                         Object o1=it.next();
  28.                         System.out.println(o1.toString());
  29.                 }
  30.                 System.out.println("-------------after sort-------------");
  31.                 for(int i=0;i<array.length;i++){
  32.                         System.out.println(array[i]);
  33.                 }
  34.         }

  35.         private static void sort(Object[] array) {
  36.                 // TODO Auto-generated method stub
  37.                 for(int i=0;i<array.length-1;i++){
  38.                         for(int j=i+1;j<array.length;j++){
  39.                                
  40.                                 compare(array,i,j);
  41.                         }
  42.                 }
  43.         }

  44.         private static void compare(Object[] array, int i, int j) {
  45.                 // TODO Auto-generated method stub
  46.                 String a1=(String)array[i];
  47.                 String a2=(String)array[j];
  48.                 if(a1.length()>a2.length()){
  49.                         String temp=(String)array[i];
  50.                         array[i]=array[j];
  51.                         array[j]=temp;
  52.                 }
  53.                 if(a1.length()==a2.length()){
  54.                         System.out.println(a1+"   "+a2);
  55.                         System.out.println(a1.compareTo(a2));
  56.                         if(a1.compareTo(a2)>0){
  57.                             
  58.                                 String temp=(String)array[i];
  59.                                 array[i]=array[j];
  60.                                 array[j]=temp;
  61.                         }
  62.                        
  63.                 }
  64.         }

  65. }

  66.        
复制代码
回复 使用道具 举报
只有类提供了这个构造方法才能new 对象,而ArrayList没有提供,所以ArrayList不具备自定义比较器的方法。
TreeSet是二叉树数据结构,存储在Set中的元素不允许重复,而且TreeSet具有按字母顺序排序的功能。如果不是我们所想要的可以自定义比较器。
就是让自定义的比较了实现Comparator父类,并且重写其compare比较方法。
回复 使用道具 举报
ArrayList没有带比较器的构造方法,TreeSet就有,这个可以从API里面查到;其根本的区别就是List是有序的,这个有序是按照存的顺序而言,而且元素是可以重复的(没办法进行比较),set则是不允许重复,而且是原本无序的,可以加进比较器排序
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马