几次接触Collection排序使用总结
初次接触Collection.sort()就是由鞠老师的作业4了解的,因为根据课程安排,这学期才开设java基础课,所有需要用到的的东西全是自学。而那次作业带给我最直观的感受就是:单纯的去学习某个方法是特别无趣乏味的,但是,当你因为要实现一个很简单的功能,而去不断摸索知识的过程,会很有动力。当功能实现了,回过头就会发现,哦,这个知识我也懂了。以后再遇到排序的问题,Collection.sort()就会跳出来,等待着我需不需要它。
工具类java.util.Collections包含于Collection结构中,简单的说,Collections类的存在,就是为Collection对象服务的。上次作业主要使用了它的Sort方法。根据参考书中的写法,Collection.sort()对list对象(List接口为Collection接口的派生接口)实施排序操作的定义为
public static void sort(List list)
public static void sort(List list,Comparator c)
Collections类仅包含使用Collection结构的类的简单静态方法。第一行的sort方法只有一个输入参数,这是把list对象按照自然顺序排列(数字按1,2,3..字母按字典顺序等),第二行的sort方法需要两个输入参数,第一个参数指明处理对象,第二个参数指明排序方式:按比较算子Comparator排序。下面来讲一下Comparator接口。
当我们需要将一组数据按照非自然顺序,即是让这组数据听从我们的安排,给他们排队的时候,就可以使用Comparator接口。其中,Comparator接口中最重要的一个方法,也就是作业中使用到的:compare方法。
public interface Comparator{
public int compare(Object o1,Object o2);
public boolean equuals(Object obj);
}
compare方法有两个Object类型的输入参数,通过比较这两个参数的一些值,确定排序方式:如果第一个元素的值小于第二个元素的值,返回值为负数;如果第一个元素的值大于第二个元素的值,返回值为正数;当两者相等时,返回值为0。
需要注意的是,方法一中List中所有元素必须实现Comparable接口。如果list中元素不能进行自然比较(比如比较字符型和整型),就会抛出错误。方法二中list中所有元素必须是能使用c进行比较的,否则也会抛出UnsupportedOperationException异常。
作业中已经完成对第二种方法的使用,写完之后感觉还是很容易实现的。下面尝试了一下对方法一的使用:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
//对Comparable接口实现
class User implements Comparable<User>
{
private String name;
private Integer order;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Integer getOrder()
{
return order;
}
public void setOrder(Integer order)
{
this.order = order;
}
public int compareTo(User arg0)
{
return this.getOrder().compareTo(arg0.getOrder());
}
} public class test
{
public static void main(String[] args) {
User user1 = new User();
user1.setName("a");
user1.setOrder(1);
User user2 = new User();
user2.setName("b");
user2.setOrder(2);
List<User> list = new ArrayList<User>();
//此处add user2再add user1
list.add(user2);
list.add(user1);
Collections.sort(list);
for(User u : list){
System.out.println(u.getName());
}
}
}
运行结果为:
注意我是按照user2,user1的顺序存入的,结果是输出的user1(a),user2(b),按照自然顺序进行了排序。
这里提一个遇到的问题:当我把User的set,get方法都生成后,还没有写compareTo方法,系统告知我:
要使Comparable的CompareTo方法生效,也就是说,当我们使用Collections.sort()进行自然排序时,必须要实现Comparable接口的CompareTo方法。
所以,当自己下次再次使用Collections.sort时,回来看看这些工作有没有做到位,给自己提个醒!
几次接触Collection排序使用总结的更多相关文章
- C# Collection 排序
Collection<int> aa = new Collection<int>(); aa.Add(1); aa.Add(2); aa.Add(3); aa.Add(1); ...
- ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TSH OJ-旅行商TSP)
做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(T ...
- C# 数据结构--排序[上]
概述 看了几天的排序内容,现在和大家分享一些常见的排序方法. 啥是排序? 个人理解的排序:通过对数组中的值进行对比,交换位置最终得到一个有序的数组.排序分为内存排序和外部排序.本次分享排序方法都为内存 ...
- Backbone.js 使用 Collection
在前面我们的 Backbone.js 用上了 Model, 但绝大数的情况下我们处理的都是一批的 Model 数据列表,所以需要有一个 Collection 来容纳 Model, 就像 Java 里最 ...
- 拓扑排序 - hdu 1285(普通和优先队列优化)
2017-09-12 19:50:58 writer:pprp 最近刚开始接触拓扑排序,拓扑排序适用于:无圈图的顶点的一种排序, 用来解决有优先级别的排序问题,比如课程先修后修,排名等. 主要实现:用 ...
- java collection (二)
1.集合的概念: (1)现实生活中:很多的事物凑在一起. (2)数学中的集合:具有共同属性的事物的总体. (3java 中的集合类: 是一种工具类,就像是容器,存储任意数量的具有共同属性的对象.(集合 ...
- bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序
Description 在一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责.从她的守卫塔向下瞭望简直就是一件烦透了的事情.她决定做一些开发智力的小练习,防止她 ...
- Java 对象排序详解
很难想象有Java开发人员不曾使用过Collection框架.在Collection框架中,主要使用的类是来自List接口中的ArrayList,以及来自Set接口的HashSet.TreeSet,我 ...
- 像使用SQL一样对List对象集合进行排序
在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分).你知道怎么对一个Movie对象组 ...
随机推荐
- Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ...
- HDUOJ----2571(命运)(简单动态规划)
命运 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- linux下git的安装和使用(转)
转自:http://www.cnblogs.com/sunada2005/archive/2013/06/06/3121098.html 最近在使用github,感觉不错.在windows下,可使用g ...
- @property和@synthesize的特性
基础回顾:get方法和set方法 定义类成员变量时,可以在@interface中定义,也可以在@implementation中定义: 在@interface中声明,成员变量的状态是受保护的,即“@pr ...
- 小记:利用递归调用循环寻找MP3文件的方法。
private void findMp3Data(File mp3file) { File[] filelist = mp3file.listFiles(); if (filelist != null ...
- js 数组去除空值
for(var i = 0 ;i<wordarr.length;i++) { if(wordarr[i] == "& ...
- 浅析Oracle范式的概念(转载)
范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中 ...
- Json数据,日期的转换
using (SQLiteConnection con = new SQLiteConnection(Constants.DATA_SOURCE)) { con.Open(); using (SQLi ...
- 【STL】-迭代器的用法
初始化: list<char>::iterator pos; 算法: 1. 遍历 for(pos = col1.begin(); pos != col1.end(); ++pos){... ...
- BCP批量导入数据时候如何处理表中自动增加的字段
大容量导入数据时保留标识值 (SQL Server) http://msdn.microsoft.com/zh-cn/library/ms186335(v=sql.120).aspx 使用格式化文件跳 ...