今天做一个简单的oj题目要用到排序,用C写的话10行左右就AC了,但是手贱了想要java提交,于是乎写了一长串代码,鼓捣了半天才AC了
我就纳闷了,同样是sort,实现起来咋就比STL复杂呢么多呢== ................ 好了 抱怨到此结束~
如果是单纯的从小到大排序是很简单的,因为sort默认就是从小到大排序= =
那么如何从大到小排序呢?如何对类进行排序呢(联想C的结构体) 类比STL中的比较函数,这里也需要一个比较函数,只不过实现起来要比C复杂一些
实现方法:sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c) 根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。其中的T[] a表示要拍排序的
类等,后面两个参数是排序的起点和终点,最后一个参数就是前面提到的比较函数,区别就是这里是一个接口.我就是在这个地方鼓捣了很久的= =
那么要实现这个接口,就要新定义一个类,让这个类来实现这个接口,里面就需要调用接口函数compare(T o1, T o2) 比较用来排序的两个参数= =这里又有一个问题函数参数是Object类型的,所以必须要进行强制转换,这个函数里面 有三种关系,大于则返回 1,等于返回0,小于返回-1.这样是默认从小到大排序,也就是说,如果想从大到小排序的话就把1改为-1.这样就可以实现类的排序了!
import java.io.*;
import java.util.*;
import java.util.Comparator;
public class Main
{
static int n,i,j;
static Sort s[]=new Sort[1000];
public static void main(String[] args)
{
Scanner cin = new Scanner(new BufferedInputStream(System.in));
n=cin.nextInt();
for(i=0;i<n;i++)
s[i]=new Sort(cin.nextInt(),cin.nextInt(),cin.nextInt());
Arrays.sort(s,0,n,new act());
for(i=0;i<n;i++)
System.out.println(s[i].a);
}
}
class Sort
{
int a,b,c;
Sort(int x,int y,int z)
{
a=x;
b=y;
c=z;
}
}
class act implements Comparator
{
public int compare(Object o1, Object o2)
{
int d1=((Sort)o1).b-((Sort)o2).b;
int d2=((Sort)o1).c-((Sort)o2).c;
if(d1>0) return -1;
if(d1<0)return 1;
if(d1==0)
{
if(d2>0)return 1;
if(d2<0)return -1;
if(d2==0)return 0;
}
return 0;
}
}