`
jsjxqjy
  • 浏览: 116308 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java基础 排序

阅读更多



1. Comparable 接口 :
Collections.sort(new ArrayList<Obj>() );

当我们需要对ArrayList里面的Obj进行排序的时候,发现这个Obj没有实现Comparable接口,说实话,我也不知道要实现这个接口才可以排序的,是IDE工具提醒我的

当我看了Collections.sort 的源码发现,最底层的比较 ,还是依据 Comparable 接口的compareTo 方法来比较的,所有要想排序,就一定要让 Obj基类实现 Comparable 接口的compareTo 方法。

//升序 ,假如Obj对象有Id 
public int compareTo(Obj o) {

		int arg0 = this.getId();
		int arg1 = o.getId();
		if (arg0 > arg1) 
		{
			return 1;
		} 
		else if (arg0 == arg1) 
		{
			return 0;
		} 
		else 
		{
			return -1;
		}
	}

//降序 ,假如Obj对象有Id 
public int compareTo(Obj o) {

		int arg0 = this.getId();
		int arg1 = o.getId();
		if (arg0 > arg1) 
		{
			return -1;
		} 
		else if (arg0 == arg1) 
		{
			return 0;
		} 
		else 
		{
			return 1;
		}
	}

 附带说明: Collections.sort() 还是调用的Arrays.sort()的方法 .这个是我自己想的,后来网上看见早有人知道了

哈哈

下面的情况是同学发我的:

 

2. 如果我们的基类已经实现了Comparable接口,但是我们排序的依据变了怎么办?

 

//对一个类没法实现多种排序。以File类为例,它实现了Comparable接口,但是
//是按照名称排序的。如果要按照大小排序,或者按修改时间排序呢?对这两种情
//况,使用java.util包的Comparator接口:
//Arrays.sort(Object[] arr, Comparator com)

//Collections.sort(Object[] arr, Comparator com)

//Comparator接口的方法:

//
//public int compare(Object o1, Object o2) 当o1比o2大时返回一个正整数

//public boolean equals(Object obj)  判断obj与这个Comparator是否同一
//个对象

//下面使用Comparator对文件实现了按文件大小或修改时间排序:
class FileUtils {

    static class CompratorByLastModified implements Comparator {

       public int compare(Object o1, Object o2) {

           File file1 = (File)o1;

           File file2 = (File)o2;

           long diff = file1.lastModified() - file2.lastModified();

           if (diff > 0)

              return 1;

           else if (diff == 0)

              return 0;

           else

              return -1;

       }

      

       public boolean equals(Object obj){

           return true;  //简单做法

       }

    }

 

    static class CompratorBySize implements Comparator {

       public int compare(Object o1, Object o2) {

           File file1 = (File)o1;

           File file2 = (File)o2;

           long diff = file1.length() - file2.length();

           if (diff > 0)

              return 1;

           else if (diff == 0)

              return 0;

           else

              return -1;

       }

      

       public boolean equals(Object obj){

           return true;  //简单做法

       }

    }

 

}

调用的示例:

       File dir = new File("C:\\temp");

       File[] files = dir.listFiles();

 

       System.out.print("before sort: ");

       for (int i = 0; i< files.length; i++)

           System.out.print(files[i] + " ");

       System.out.println();      

      

       Arrays.sort(files);

       System.out.print("sort by name: ");

       for (int i = 0; i< files.length; i++)

           System.out.print(files[i] + " ");

       System.out.println();      

 

       Arrays.sort(files, new FileUtils.CompratorBySize());

       System.out.print("sort by size: ");

       for (int i = 0; i< files.length; i++)

           System.out.print(files[i] + " ");

       System.out.println();      

 

       Arrays.sort(files, new FileUtils.CompratorByLastModified());

       System.out.print("sort by last modified: ");

       for (int i = 0; i< files.length; i++)

           System.out.print(files[i] + " ");

       System.out.println();      



 

分享到:
评论
2 楼 jsjxqjy 2010-06-21  
zzpxingfu 写道



我这里的是 对象的排序, 不是数据的
1 楼 zzpxingfu 2010-06-10  

相关推荐

Global site tag (gtag.js) - Google Analytics