前言:

  有些时候,我们在编程中会遇到多列排序的需求。假如在execle,这事儿就太easy了。不过没办法,现在就需要你用Java或者C++实现这样一个功能!

比如将下表无序的数据通过重排之后按照以下规则显示结果:

1.第二列从大到小排列

2.若第二列相等,则第一列按照从小到大排序

排序前

排序后

2 5
3 2
2 1
11 75
21 101
32 21
20 59
13 21

21 101
11 75
20 59
13 21
32 21
2 5
3 2
2 1

-------------------------------------

C++实现一:运算符重载

  1. #include <cstdio>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. const int maxn = 1e4+;
  7. struct Job{
  8. int x,y;
  9. bool operator < (const Job &j) const { //operator
  10. if(y==j.y){
  11. return x < j.x;
  12. }
  13. return y > j.y;
  14. }
  15. };
  16.  
  17. int main(){
  18. // 从文件读入
  19. freopen("datain.txt","r",stdin);
  20. freopen("dataout.txt","w",stdout);
  21. int n,x,y;
  22. while(scanf("%d",&n)== && n){
  23. vector<Job> v;
  24. for(int i=;i<n;i++){
  25. scanf("%d%d",&x,&y);
  26. v.push_back(Job{x,y});
  27. }
  28.  
  29. sort(v.begin(),v.end());
  30. //输出
  31. for(int i=;i<n;i++){
  32. printf("%d %d\n",v[i].x,v[i].y);
  33. }
  34.  
  35. }
  36. return ;
  37. }

C++实现二:重写cmp()比较函数

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. const int maxn = 1e4+;
  6. struct Job{
  7. int x,y;
  8.  
  9. };
  10. bool cmp(Job j1,Job j2){
  11. if(j1.y==j2.y)
  12. return j1.x < j2.x;
  13. return j1.y > j2.y;
  14. }
  15.  
  16. Job A[maxn];
  17. int main(){
  18. //将数据从文件读入
  19. freopen("datain.txt","r",stdin);
  20. int n;
  21. while(scanf("%d",&n)== && n){
  22. for(int i=;i<n;i++){
  23. scanf("%d%d",&A[i].x,&A[i].y);
  24. }
  25.  
  26. sort(A,A+n,cmp);
  27. for(int i=;i<n;i++){
  28. printf("%d %d\n",A[i].x,A[i].y);
  29. }
  30.  
  31. }
  32. return ;
  33. }

Java实现一:实现Comparable接口,重写compareTo()方法

  1. package sort;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.List;
  6.  
  7. /*
  8. * 重写Comparable接口的campareTo(Object o)方法
  9. */
  10. class Task implements Comparable<Task>{
  11. int x,y;
  12.  
  13. public Task(int x,int y) {
  14. this.x=x;
  15. this.y=y;
  16. }
  17. @Override
  18. public int compareTo(Task o) {
  19. if(this.y==o.y)
  20. return this.x-o.x;
  21. return o.y-this.y;
  22. }
  23. @Override
  24. public String toString() {
  25. String r = this.x+" "+this.y;
  26. return r;
  27. }
  28.  
  29. }
  30. public class TestCompare {
  31. public static void main(String[] args) {
  32. Task t1 = new Task(5,2);
  33. Task t2 = new Task(5,4);
  34. Task t3 = new Task(3,2);
  35.  
  36. List<Task> tasks = new ArrayList<Task>();
  37. tasks.add(t1);
  38. tasks.add(t2);
  39. tasks.add(t3);
  40.  
  41. //排序sort
  42. Collections.sort(tasks);
  43.  
  44. //打印输出
  45. for(Task t:tasks){
  46. System.out.println(t);
  47. }
  48. }
  49. }

Java实现二:重写compare方法

  1. package sort;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Comparator;
  5. import java.util.List;
  6.  
  7. import com.gdufe.mian4.Collection;
  8. import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils.Collections;
  9.  
  10. class Job {
  11. int x;
  12. int y;
  13.  
  14. public Job(int x, int y) {
  15. this.x = x;
  16. this.y = y;
  17. }
  18.  
  19. public String toString() {
  20. String r = this.x + " " + this.y;
  21. return r;
  22. }
  23. }
  24.  
  25. public class TestCompare2 {
  26.  
  27. public static void main(String[] args) {
  28. List<Job> jobs = new ArrayList<Job>();
  29. Job j1 = new Job(2,4);
  30. Job j2 = new Job(5,3);
  31. Job j3 = new Job(1,4);
  32. jobs.add(j1);
  33. jobs.add(j2);
  34. jobs.add(j3);
  35.  
  36. //重写Comparator接口的Compare方法:先按照第二列从大到小,若第二列相等则第一列从小到大排序
  37. Comparator<Job> c = new Comparator<Job>() {
  38.  
  39. @Override
  40. public int compare(Job o1, Job o2) {
  41. if(o1.y==o2.y){
  42. return o1.x-o2.x;
  43. }
  44. return o2.y-o1.y;
  45. }
  46. };
  47.  
  48. System.out.println("输出排序后的结果:");
  49. java.util.Collections.sort(jobs, c);
  50. for(Job job:jobs){
  51. System.out.println(job);
  52. }
  53.  
  54. }
  55.  
  56. }

自定义多列排序:C++/Java实现的更多相关文章

  1. Java基础知识强化之集合框架笔记69:Collections类之ArrayList存储自自定义对象并排序的案例

    1. ArrayList存储自自定义对象并排序的案例: ArrayList存储自自定义对象,并使用Collections对ArrayList存储基本包装类的元素排序. 2. 代码实现: (1)Stud ...

  2. Java 多维数组 按某列 排序

        public MetaCell[][] getByColumn(final int columnIndex, int decisionIndex) {//[注意]final咯          ...

  3. EasyUI扩展——自定义列排序匹配字段

    一些特殊情况下希望实现:单击某些列,但是排序要按照自定义指定另外的列排序 easyui扩展: 如果不写sort属性则按照默认该列的field排序 $.fn.datagrid.defaults.onBe ...

  4. DataGridView的自定义列排序

    1,将需要进行排序的列做属性的设置 this.colUserName.SortMode = DataGridViewColumnSortMode.Programmatic; 2,添加列的事件 //点击 ...

  5. Jtable 表格按多列排序(支持中文汉字排序)

    这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...

  6. Hadoop学习之自定义二次排序

    一.概述    MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往 往有要对reduce输出结果进行二次排 ...

  7. 重写Oracle的wm_concat函数,自定义分隔符、排序

    oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...

  8. Spark基础排序+二次排序(java+scala)

    1.基础排序算法 sc.textFile()).reduceByKey(_+_,).map(pair=>(pair._2,pair._1)).sortByKey(false).map(pair= ...

  9. 几种经典的数据排序及其Java实现

    选择排序 思想 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: ①初始状态:无序区为R[1..n],有序区为空. ②第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k ...

随机推荐

  1. Android屏幕禁止休眠的方法

    实现这一功能的方法有两种,一种是在Manifest.xml文件里面声明,一种是在代码里面修改LayoutParams的标志位.具体如下: 1.在Manifest.xml文件里面用user-permis ...

  2. UILabel顶部对齐解决方法(转载)

    问题 我有一个UILabel高度最多能显示两行,如果里面内容只有一行,它是垂直居中的.怎么能让它顶端对齐呢?   回答 答案1:用sizeToFit改变UILabel的高度 nevan king,19 ...

  3. UIScrollView解决无法触发手势

    //创建一个分类 //.h #import <UIKit/UIKit.h> @interface UIScrollView (Touch) - (void)touchesBegan:(NS ...

  4. document.readyState等属性

    document.readyState:判断文档是否加载完成.firefox不支持. 这个属性是只读的,传回值有以下的可能: 0-UNINITIALIZED:XML 对象被产生,但没有任何文件被加载. ...

  5. django复习笔记3:urls/views/templates三板斧

    0.先看看文件结构 mysite/ mysite/ ├── __pycache__ │   └── manage.cpython-.pyc ├── blog │   ├── __init__.py │ ...

  6. Regular Expression Matching

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  7. [TED] New video technology that reveals an objects hidden properties

    通过视频中,即使1微米的震动,都能够还原成声音. 程序算法结合基础学科,能够发挥出接近无限的力量, 深入挖掘物理特性,形成你想都想不到的效果. 很多技术你都不知道,怎么和国家对抗?所以还是要遵纪守法 ...

  8. Android -- 桌面悬浮,QQ管家火箭实现

    续上一篇博客<Android -- 桌面悬浮,仿360>,传送门:http://www.cnblogs.com/yydcdut/p/3909888.html,在此代码上继续添加实现. 比起 ...

  9. 安装包制作工具 SetupFactory使用1 详解

    2014-11-19 Setup Factory 是一个强大的安装程序制作工具.提供了安装制作向导界面,即使你对安装制作不了解,也可以生成专业性质的安装程序.可建立快捷方式,也可直接在 Windows ...

  10. SQL基础之XML

    1.XML数据类型 在SQL Server中xml数据类型可以用来保存xml文档,这个文档即可以是完整的xml文档和xml片段,这样开发者就可以像使用int数据类型一样来使用xml数据类型.不过xml ...