java Collections排序问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java Collections排序问题相关的知识,希望对你有一定的参考价值。
package day05;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ComparatorDemo
/**
* @param args
*/
public static void main(String[] args)
List<String> list=new ArrayList<String>();
list.add("able");
list.add("adam");
list.add("marry");
list.add("BOSS");
list.add("killer");
list.add("TOM");
System.out.println(list);
/**
* 使用字符串定义的比较规则进行自然排序
*/
Collections.sort(list);
System.out.println(list);
/**
* 不希望使用字符串的比较规则进行排序,
* 而是按照字符的多少进行比较后再排序
*/
Collections.sort(list,new MyComparator());
//System.out.println(list);
/**
* 通常我们使用匿名内部类的形式创建临时的比较规则
*/
Comparator comparator=new Comparator<String>()
public int compare(String o1,String o2)
return o2.length()-o1.length();
;
Collections.sort(list,comparator);
System.out.println(list);
倒数第三个代码,就是return 为什么o2.length()-o1.length();是字符串长度升序排列,而o1.length()-o2.length();就变成了降序
首选你要明白Collections.sort方法是按照从小到大递增来排序的
假设o2比o1长,
1、o2.length()-o1.length()值就是大于0,注意方法第一个形参为o1,第二个形参为o2,此时方法返回值大于0,代表了o1要比o2大,所以o1会排在o2的后面,即降序排列
2、o1.length()-o2.length值小于0,此时返回结果小于0,标识o1比o2小,所以o1会排在o2前面,即升序排序。追问
你的逻辑有些问题?第一条
追答o2比o1长的时候(假设o2是"22",o1是"1"),返回值大于0.但第一个形参是o1,第二个形参是o2,对于sort方法来说就是o1比o2大,也就是o1会排在o2后面。此时排序就是"22","1"也就是降序排序
参考技术A 1、排序 就是说白了就是要得到两个对象的差值2、以Integer类的比较为例,比较大小返回的值有3种情况,大于零的值(1),小于零的值(-1) 和 零,如下:
Integer类中的比较大小方法:
public static int compare(int x, int y)
return (x < y) ? -1 : ((x == y) ? 0 : 1);
3、如果对对象比较,则要按一定的规则进行比较
4、String类自身已经实现了Comparable接口,他是按照字典规则 规定大小的,即自然顺序,所以可以直接排序 (),其实返回的就是字符串字符的差,代码如下:
public int compareTo(String anotherString)
int len1 = value.length; //value 是构成字符串的字符数组
int len2 = anotherString.value.length; //同上
int lim = Math.min(len1, len2); //偷懒了,只取最小的长度
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim)
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2)
return c1 - c2; //返回了字符的差值
k++;
return len1 - len2; //k个数值全部相同的话,结果就直接返回字符数组的差值,正数、负数、零
5、如果要修改对象或者String的比较规则,则需要自定义返回值得 零 非零 的情况
代码中的比较器就是直接返回了字符串的长度的差,正数、负数、零 分别代表的是大于、小于和等于
6、sort方法排序 实际上完全按照升序来排序的,那些看来是逆序的排列,实际上是 在大于的情况下,返回的是负数,越大 返回的值越小,最终的结果看上去即使逆序排列 参考技术B 排列顺序与compare的返回值有关,分三种情况,<0 , =0, 和 >0,假如<0的结果是升序,那>o的结果就是降序,=0表示比较的两个元素不改变位置。 参考技术C 你要知道Collection使用的排序相当于把第二个参数传入的对象当做一个判断器,
只要compare返回的是大于0的数意味着o1<o2的字符串长度,也就意味着在list中后边的元素比前边的大,下边的类似
Java Collections的排序之二
package test.list; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.TreeSet; public class Link_T { public static void main(String[] args) { //创建list List list = new ArrayList<>(); // 添加内容 int count = 20; for (int i = count; i > 0; i--) { list.add(i); } System.out.println(list); //输出结果:[20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] //排序(根据元素的自然顺序对指定的List集合按升序排序) Collections.sort(list); System.out.println(list); //输出结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] } }
以上是关于java Collections排序问题的主要内容,如果未能解决你的问题,请参考以下文章
Java排序小问题 (怎么改成Collections.sort(liste lements)排序)
csharp 集合的并发,避免使用传统的锁(lock)机制等方式来处理并发访问集合。因此当有多个线程并发访问集合时,应首先考虑使用这些类代替System.Collections和System.Coll