java排序问题,comparator接口,求高手

list里存着("张三","李四","王五","张六"),要求按姓名首字母排序,并且返回这个排序以后的下标!!!
比如这个集合,返回的应该是 1 2 3 0 求高手指点怎么用comparator接口啊!!!
map 解决不了,因为这里的名字可能会重复,已经试过了,能贴出代码的+20分

首先,比较Comparable和Comparator的区别

Comparable & Comparator 都是用来实现集合中的排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。

Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作);

而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。

可以说一个是类自已完成比较,一个是外部程序实现比较的差别而已。

用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。

从操作上:Comparable 需要在被排序的类中实现其接口,而Comparator 是在被排序类的外部实现其接口即可.这样可以看出Comparable操作更简单,而Comparator操作复杂但是可以实现多种不同的排序方案.

比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不能去修改 Integer 类去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。

实现Comparator接口,实现排序

在Comparator接口里,只有一个方法是需要实现的:
Java代码
int compare(Object o1,Object o2);

int compare(Object o1,Object o2);
提示:如果o1小于o2,返回一个负数;如果o1大于o2,返回一个正数;如果他们相等,则返回0;

注意:compare方法一定要是对称的,意思是compare(a,b)返回的结果要跟compare(b,a)相反。相反的结果意味着,要么返回的值带有不同的正负号,要么都是0。注意,象compare(a,b)返回4而compare(b,a)返回-2这样的情况是合法的。方法里常常可能抛出异常,在这个方法里抛出异常也要是对称的。如果调用compare(a,b)时抛出了一个ClassCastException异常,那么调用compare(b,a)时也必须抛出一个ClassCastException异常。

另外:任何你准备重用的Comparator都必须是可序列化的。TreeSet和TreeMap类存储Comparator以便进行比较,因此为了这两个类能被序列化,它们使用的Comparator也必须能被序列化。

Comparator接口,通常被Collections.sort方法使用,它是JAVA中需要了解的一个很重要的部分,因为它有一些重要的契约义务.追问

我要的不是排序后的数组,而是排序后的下标

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-03-20
这个严格按照拼音顺序进行排序,试一下吧
import java.util.*;
class Test
{
public static void main(String[] args)
{
int index=0;
ArrayList<String> al=new ArrayList<String>();
al.add("张三");
al.add("李四");
al.add("王五");
al.add("张六");
Collections.sort(al,new SortComparator());
for(String name : al)
{
System.out.println(name);
System.out.println(name+"的下标为:"+(index++));
}
}
}

class SortComparator implements Comparator<Object>
{
public int compare(Object o1,Object o2)
{
try
{
byte[] buf1 = ((String) o1).getBytes("GB2312");
byte[] buf2 = ((String) o2).getBytes("GB2312");
int size = Math.min(buf1.length, buf2.length);
for (int i = 0; i < size; i++)
{
if (buf1[i] < buf2[i])
return -1;
else if (buf1[i] > buf2[i])
return 1;
}
return buf1.length - buf2.length;
}
catch(Exception ex)
{
return 0;
}
}
}追问

哥们,你这个可以排序,问题是我要的下标是原来数组中的下标,你这个下标是0123,我要的下标是1230啊

追答

改好了,你再看一下吧
import java.util.*;
class Test
{
public static void main(String[] args)
{
ArrayList al1=new ArrayList();
al1.add("张三");
al1.add("李四");
al1.add("王五");
al1.add("张六");
ArrayList al2=new ArrayList(al1);
Collections.sort(al2,new SortComparator());
for(String name : al2)
{
System.out.println(name);
}
Iterator it=al1.iterator();
for(int i=0;i
{
public int compare(Object o1,Object o2)
{
try
{
byte[] buf1 = ((String) o1).getBytes("GB2312");
byte[] buf2 = ((String) o2).getBytes("GB2312");
int size = Math.min(buf1.length, buf2.length);
for (int i = 0; i buf2[i])
return 1;
}
return buf1.length - buf2.length;
}
catch(Exception ex)
{
return 0;
}
}
}

追问

嗯 你的代码基本实现了,最后用的是查找的算法,但是我的名字集合里有重复值,例如
("张三","李四","王五","张六","李四","王五"),这样的算法会造成下标重复啊,还有其他的办法吗

本回答被提问者采纳
第2个回答  2013-01-24
中文字符串.getBytes()得到字节数组每个元素比较可以比较中文,是比较一个汉字拆分成的每个字节?调用tocharArray()得到的字符比较试了下发现不行,这个是什么原因?求指教。
第3个回答  2012-03-07
如楼上说的Collator可以搞定追问

那是我自己说的

追答

搞错。。。那还有啥问题~?

追问

我要返回排序以后的集合的,原下标

追答

你要的不是对集合里面的内容排序么?。。你可以定义一个数组,长度,内容与你的集合一样,,然后写个冒泡算法。。。得出来的就是排序好的集合了。。不明白你非要那个下标来干嘛,
真的要那个下标你就再定义一个数组,放下标的,比较的时候,也把这个放下标的数组也一起比较,冒泡算法跑完了,你要的下标也有了

追问

冒泡有比较大小,整数就不说,中文怎么比较?
comparator可以比较中文,但是又返回不了下标,怎么办?

追答

冒泡不止是比较数字的吧。。。转换一下就可以了啊。。原来是array[x+1]>array[x]就将他们位置互换。。。你改成Collator.getinstance().compare(array[x+1],array[x])>1这样是一样的概念。。。

第4个回答  2012-03-07
这个看API就行了追问

看不懂

追答

comparator接口我倒是知道怎么用,不过按拼音首字母的话就不是能随便写得出来的了,需要做汉字和拼音的映射,这都用别人写的包才行啊

追问

你这水平不行
Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);
Arrays.sort(a, cmp);
这样就可以对中文首字母排序,我只是不知道如何返回下标

追答

还是用说的吧,工具没开。
实现Comparator接口,实现其compare方法,Comparator接口需要指定泛型,比如你list里面的每个元素都是一个User对象的话,class MyComparator implements Comparator{*******};
compare方法有两个参数,指定了泛型过后,参数类型就是你指定的类型,比如这儿compare方法就是 public int compare(User o1, User o2){****};compare里面怎么比较就随便你了,原则就是如果o1>o2,返回1,o1<o2返回-1(其实只要是正整数和负整数都行),o1==o2返回0,。完了~

Java编写程序实现Comparator接口,实现字符串按 降序排序怎么弄?_百度...
Comparator升序降序实现 int compare(Object o1, Object o2) 返回一个基本类型的整型 1) 如果要按照升序排序, 则o1 小于o2,返回-1(负数),相等返回0,01大于02

Java中Comparator接口
在Java中,为了对实体类Step(如:com.ljq.entity.Step)的日期属性进行排序,我们需要实现Comparator接口。首先,创建一个实体类表示步骤:com.ljq.entity.Step ...接着,我们需要实现Comparator接口的子类,比如StepComparator,用于定义排序规则,这里以日期升序为例:com.ljq.entity.StepComparator ...在...

关于java使用Comparator多列数据升序、降序排列的问题。哪位大侠能...
重写一下compare方法就行啊。一个多if判断的问题,升序代码 如果(产品好相等){ 升序代码 如果(会员号相等){ 升序代码 如果(客户号相等){ 降序代码 如果(顺序号相等){ } } } } 升序和降序其实就是a>b是return 1还是return -1 的事。如果需要代码就接着追问。

Java里的Comparator这两个接口的排序该如何去很好的理解able和Compar...
Comparator是说你自己可以创造一个比较器,可以使用Arrays.sort(array,comparator) 这么就按照你的想法排序了。 这里面comparator你当然可以写成一个匿名类了,里面需要实现方法compare()。而Comparable 直接就提供了eaqul比较 因为你实现该类的时候会实现一个方法compareTo() 。一个意思 ...

java中comparator和compare它们两个是按照从大到小排序的还是从小到大...
comparator是个比较器接口,实现这个接口可以自己定义一个排序方式 compare是一个方法,你要定义一个排序必须重写这个方法 有很多比较器,一般默认字典顺序

Java中,如果想要排序,实现Comparator接口 \/\/与Comparable 的区别...
1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的,什么是自定义class: 如 public class Person{ String name; int age }.当我们有这么一个personList,里面包含了person1, person2, persion3..., 我们用Collections.sort( personList ), 是得...

请教:JAVA中,comparator接口如何对double型数据进行排序。
返回值是int -1,0或1。1表示第一个数比第二个数大,0表示相等,-1表示第一个数比第二个数小。这个int跟你要比较的数值类型没关系。举例:import java.util.Comparator;public class Test1 implements Comparator<Double>{ public int compare(Double o1, Double o2) { return o1.compareTo(o2)...

来吧,一文彻底搞懂Java中的Comparable和Comparator
选择哪一个在选择使用Comparable还是Comparator时,考虑对象的排序方式至关重要。如果需要基于自然顺序进行排序,那么Comparable接口是最佳选择。而如果对象需要根据多个属性进行排序,或者在排序逻辑上更为复杂,那么使用Comparator接口更为合适。通过深入了解这两种接口的特点和用法,相信你已经掌握了如何在Java中...

java中的一个排序方法,求大神给讲解一下?
1 传入方法名和排序标志==>getProp1(); getProp2()之类的.desc and other;2 Collections.sort(List<T> list, Comparator c)\/\/ The second param is an INTERFACE 传入Comparator的 实现类, 实现compare方法即可;3 利用m1 ,m2 (关于如何通过getProp1()获得对应的方法,详见反射reflect),通过调用...

java Comparator中的返回值和排序有什么关系啊,求解释!!!
负数代表左值小于右值,排在上面 正数代表左值大于右值,排在下面 0代表左值等于右值,排在上面 可以这样理解:排序就是比较谁大谁小,将小的放在前面,大的放在后面。例如当返回负数的时候,表明第一个数应该排在第二个数的上面。

相似回答