(1)对象数组排序
java没有结构体,所以在算法竞赛中有时候对于有多个属性属于同一个事物,这时候就要创建一个类来存储,而算法竞赛中往往有多个数据,所以要用对象数组来存储。如果要按照某一个属性来对这个对象数组进行升序或降序排序,那么就需要用Arrays.sort(),但是这个创建的类一定要继承Comparable这个接口并重写compareTo方法。代码如下:
package 排序;
import java.util.Arrays;
public class test1 {
public static void main(String[] args) {
people[] arr= new people[]{
new people(1),
new people(3),
new people(2)
};
Arrays.sort(arr);
for(int i=0;i<3;i++) {
System.out.println(arr[i].age);
}
}
}
class people implements Comparable<people>{
int age;
people(int age){
this.age=age;
}
@Override
public int compareTo(people o1) {
return o1.age-age;
}
}
(2)集合类自定义排序
集合类有一些自动排序的类,比如TreeMap和TreeSet,但是它们都是按照自然排序进行排序的,但是算法竞赛中有时候是要自定义排序的,比如分数排名,分数高的要在前面。所以就要使用Comparator这个接口并重写compare方法,这个接口和上面那个接口并不相同,要注意区分。代码如下:
package 排序;
import java.util.Comparator;
import java.util.TreeMap;
import java.util.TreeSet;
public class test2 {
public static void main(String[] args) {
TreeSet<Integer> ts=new TreeSet<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
ts.add(2);
ts.add(3);
ts.add(1);
TreeMap<Integer, Integer> tm=new TreeMap<Integer, Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(ts);
tm.put(1, 4);
tm.put(3, 6);
tm.put(2,5);
System.out.println(tm);
}
}
(3)Map按照值排序
假如有给出一些学生的学号和成绩,要按照成绩高低输出学生的学号和成绩,那么肯定是以学号作为键的,因为成绩可能有重复不能作为键。但是如果用成绩作为值的话那么就要用另一种比较复杂的方法重写排序规则,当然在竞赛中如果下面方法忘记了也可以用第一种排序方法创建一个类模拟TreeMap进行排序。代码如下:
package 排序;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
public class test3 {
public static void main(String[] args) {
TreeMap<Integer, Integer> tm=new TreeMap<Integer, Integer>();
tm.put(1, 10);
tm.put(3, 5);
tm.put(2,7);
List<Map.Entry<Integer,Integer>> list = new ArrayList<Map.Entry<Integer,Integer>>(tm.entrySet());
Collections.sort(list,new Comparator<Map.Entry<Integer,Integer>>() {
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
return o2.getValue()-o1.getValue();
}
});
for(Entry<Integer, Integer> e:list) {
System.out.println(e.getKey()+"--"+e.getValue());
}
}
}