前言:

  有些时候,我们在编程中会遇到多列排序的需求。假如在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+5;
 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)==1 && n){
23         vector<Job> v;
24         for(int i=0;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=0;i<n;i++){
32             printf("%d %d\n",v[i].x,v[i].y);
33         }
34
35     }
36     return 0;
37 }

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

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 const int maxn = 1e4+5;
 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)==1 && n){
22         for(int i=0;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=0;i<n;i++){
28             printf("%d %d\n",A[i].x,A[i].y);
29         }
30
31     }
32     return 0;
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
37         //重写Comparator接口的Compare方法:先按照第二列从大到小,若第二列相等则第一列从小到大排序
38         Comparator<Job> c = new Comparator<Job>() {
39
40             @Override
41             public int compare(Job o1, Job o2) {
42                 if(o1.y==o2.y){
43                     return o1.x-o2.x;
44                 }
45                 return o2.y-o1.y;
46             }
47         };
48
49         System.out.println("输出排序后的结果:");
50         java.util.Collections.sort(jobs, c);
51         for(Job job:jobs){
52             System.out.println(job);
53         }
54
55     }
56
57 }

转载于:https://www.cnblogs.com/SeaSky0606/p/4734239.html

自定义多列排序:C++/Java实现相关推荐

  1. js中sort()字母排序和自定义多列排序

    面试题 有两个数组data和sorts如下:根据sorts对data排序 var data = [{ a: 1, b: 'a' }, { a: 2, b: 'c' }, { a: 2, b: 'b' ...

  2. R语言dplyr包arrage函数排序dataframe实战:单列排序、多列排序、自定义排序

    R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序.自定义排序 目录 R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序

  3. Java黑皮书课后题第8章:*8.27(列排序)用下面的方法实现一个二维数组中的列排序。返回新数组,且原数组保持不变。编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵

    *8.27(列排序)用下面的方法实现一个二维数组中的列排序.返回新数组,且原数组保持不变.编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵 题目 题目描述与运行示例 破 ...

  4. Java基础-TreeSet与Java自定义类型的排序

    TreeSet与Java自定义类型的排序 演示TreeSet对String是可排序的 TreeSet无法对自定义类型进行排序 比较规则怎么写 自平衡二叉树结构 实现比较器接口 Collections工 ...

  5. java excel 多列排序,《excel表格调取行和列的数据》 excel列排序的时候怎么让所有行的信息跟着排(其它的非数据行)...

    Java里面怎么调用excel表格中的x行第y列的数据,将其赋值到int型变量i InputStream inp = new FileInputStream("workbook.xls&qu ...

  6. bootstrap-table自定义列排序

    bootstrap-table要实现排序的功能需要在给定的列添加两个属性 1:sortable(配置项)/data-sortable(html中的属性) 为true 2:如果列表中的数据是单纯的数值则 ...

  7. Java黑皮书课后题第8章:*8.16(对二维数组排序)编写一个方法,使用下面的方法头对二维数组排序。这个方法首先按行排序,然后按列排序

    *8.16(对二维数组排序)编写一个方法,使用下面的方法头对二维数组排序.这个方法首先按行排序,然后按列排序 题目 题目描述 破题 代码 运行实例 题目 题目描述 *8.16(对二维数组排序)编写一个 ...

  8. java多维数组按照某一列排序,PHP实现二维数组按某列进行排序的方法

    本文实例讲述了PHP实现二维数组按某列进行排序的方法.分享给大家供大家参考,具体如下: /* * 二维数组 按某列排序 * array_multisort($arr1,$arr2) * 手册 例子如下 ...

  9. hadoop之MapReduce自定义二次排序流程实例详解

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

最新文章

  1. Go 学习笔记(62)— Go 中 switch 语句中的 switch 表达式和 case 表达式之间的关系
  2. oracle imp使用
  3. linux c实现myecho、mycat、mycp
  4. [vue] v-once的使用场景有哪些?
  5. 使用outputstream写到指定位置_MaxCompute Spark与Spark SQL对比分析及使用注意事项
  6. 你还在为文件读写而烦恼?Python已经轻松帮你解决了(建议学习)
  7. 2022年Java程序设计讲课笔记
  8. 机器学习中常见的距离公式
  9. 终端/Shell 快捷键
  10. 修改android的avd路径方法
  11. mysql 协议解析源码 c_MySQL协议分析2
  12. 静态路由实验:Dynagen-Dynamips + WinPcap + SecureCRT
  13. acrobat缺少字体 adobe_PDF 字体
  14. python——spilt和strip用法
  15. Android 新闻客户端案例
  16. 阿里云李飞飞:中国数据库的时与势
  17. word表格和后面的文字间距太小
  18. 结构化命令case和for、while循环
  19. Pandas引言(二)
  20. 海外跨境电商5大关键趋势,Starday带你先发制人

热门文章

  1. 前端学习(3104):react-hello-react案例
  2. 前端学习(3088):vue+element今日头条管理-关于接口的使用(有声版)
  3. 一文简述npm和cnpm和yarn的区别
  4. [js] 说说你对js对象生命周期的理解
  5. 工作186:实际案例解决vue+el-element二级联动,选项选择后不显示的问题
  6. 工作总结17:组件封装思想
  7. java面试题34下面关于程序编译说法正确的是()
  8. 玩转oracle 11g(38):rman备份-全库恢复
  9. air android 通信,Android超声波通信例子
  10. js计算数组中每个元素出现的次数(2种方法)