今天写Android应用,遇到一个对List进行排序的问题,通过google的提示,发现用Collections.sort(List list, Comparator c) 就能够对List/ArrayList进行排序,很Happy的去写代码作测试,结果发现排序没有起做用,检查之,发现代码没什么问题啊(代码以下),奇怪了。
app
- public void changeSort(int type){
- Comparator<ItemBean> comparator;
- Toast.makeText(this, "type=="+type, 5).show();
- switch(type){
- case 1:{
- // 价格从低到高排序
- comparator = new PriceLowToHighComparator();
- Collections.sort(list, comparator);
- }
- break;
- case 2:{
- // 价格从高到低排序
- comparator = new PriceHighToLowComparator();
- Collections.sort(list, comparator);
- }
- break;
- }
- adapter.setItemBeanList(list);
- adapter.notifyDataSetChanged();
- }
- public class PriceHighToLowComparator implements Comparator<ItemBean> {
- @Override
- public int compare(ItemBean itemBean1, ItemBean itemBean2) {
- double price1 = 0;
- double price2 = 0;
- if(itemBean1.getItemPrice() != null && !"".equals(itemBean1.getItemPrice())){
- price1 = Double.parseDouble(itemBean1.getItemPrice());
- }
- if(itemBean2.getItemPrice() != null && !"".equals(itemBean2.getItemPrice())){
- price2 = Double.parseDouble(itemBean2.getItemPrice());
- }
- if(price1 > price2){
- return -1;
- }
- else if(price1 < price2){
- return 1;
- }
- else{
- return 0;
- }
- }
- }
而后就是各类改返回值,反复改了三次之后发现问题所在,返回值不正确,上面的这个类是list的价格从高到低的规则类,Collections.sort(List list, Comparator c) 会根据返回值来对list中的数据进行排序,最初若是price1>price2,则return 1,可是试验发现list中的数据无变化,随后改为return -1,试验发现list中的数据能按照预想的效果排序了,但是新的问题出来了,为何price1>price2,可是要返回-1呢?ide
继续google之,发现http://solodu.iteye.com/blog/630891 这篇文章的主人在文章结尾说了一段话“要充分理解排序就必须先理解最后的return 0, -1 , 1 这三个数字表明的含义。它们不是表明数字而是表明前面和后面要比较的值哪一个大哪一个小?若是是0表示要比较的这两个数字相等。若是是1表示前面数字大,若是-1表示前面数字小。要理解这个就没问题了。”可是结合我本身写的这个排序规则,我忽然以为0,1,-1这三个数好像不是说谁大谁小,而是一个排序的问题,当返回-1时,前面的变量(即price1)排在后面的变量(price2)的前面,反之则排在后面。果然如此么,正好就着此次的项目的排序要求比较多,也就多写几个规则测试一下,结果确实如此,根据不一样规则,若是想将前面的变量放到后面的变量以前,则返回-1便可。测试