自定义多列排序:C++/Java实现
前言:
有些时候,我们在编程中会遇到多列排序的需求。假如在execle,这事儿就太easy了。不过没办法,现在就需要你用Java或者C++实现这样一个功能!
比如将下表无序的数据通过重排之后按照以下规则显示结果:
1.第二列从大到小排列
2.若第二列相等,则第一列按照从小到大排序
排序前 |
排序后 |
2 5 |
21 101 |
-------------------------------------
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实现相关推荐
- js中sort()字母排序和自定义多列排序
面试题 有两个数组data和sorts如下:根据sorts对data排序 var data = [{ a: 1, b: 'a' }, { a: 2, b: 'c' }, { a: 2, b: 'b' ...
- R语言dplyr包arrage函数排序dataframe实战:单列排序、多列排序、自定义排序
R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序.自定义排序 目录 R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序
- Java黑皮书课后题第8章:*8.27(列排序)用下面的方法实现一个二维数组中的列排序。返回新数组,且原数组保持不变。编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵
*8.27(列排序)用下面的方法实现一个二维数组中的列排序.返回新数组,且原数组保持不变.编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵 题目 题目描述与运行示例 破 ...
- Java基础-TreeSet与Java自定义类型的排序
TreeSet与Java自定义类型的排序 演示TreeSet对String是可排序的 TreeSet无法对自定义类型进行排序 比较规则怎么写 自平衡二叉树结构 实现比较器接口 Collections工 ...
- java excel 多列排序,《excel表格调取行和列的数据》 excel列排序的时候怎么让所有行的信息跟着排(其它的非数据行)...
Java里面怎么调用excel表格中的x行第y列的数据,将其赋值到int型变量i InputStream inp = new FileInputStream("workbook.xls&qu ...
- bootstrap-table自定义列排序
bootstrap-table要实现排序的功能需要在给定的列添加两个属性 1:sortable(配置项)/data-sortable(html中的属性) 为true 2:如果列表中的数据是单纯的数值则 ...
- Java黑皮书课后题第8章:*8.16(对二维数组排序)编写一个方法,使用下面的方法头对二维数组排序。这个方法首先按行排序,然后按列排序
*8.16(对二维数组排序)编写一个方法,使用下面的方法头对二维数组排序.这个方法首先按行排序,然后按列排序 题目 题目描述 破题 代码 运行实例 题目 题目描述 *8.16(对二维数组排序)编写一个 ...
- java多维数组按照某一列排序,PHP实现二维数组按某列进行排序的方法
本文实例讲述了PHP实现二维数组按某列进行排序的方法.分享给大家供大家参考,具体如下: /* * 二维数组 按某列排序 * array_multisort($arr1,$arr2) * 手册 例子如下 ...
- hadoop之MapReduce自定义二次排序流程实例详解
一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求 ...
最新文章
- Go 学习笔记(62)— Go 中 switch 语句中的 switch 表达式和 case 表达式之间的关系
- oracle imp使用
- linux c实现myecho、mycat、mycp
- [vue] v-once的使用场景有哪些?
- 使用outputstream写到指定位置_MaxCompute Spark与Spark SQL对比分析及使用注意事项
- 你还在为文件读写而烦恼?Python已经轻松帮你解决了(建议学习)
- 2022年Java程序设计讲课笔记
- 机器学习中常见的距离公式
- 终端/Shell 快捷键
- 修改android的avd路径方法
- mysql 协议解析源码 c_MySQL协议分析2
- 静态路由实验:Dynagen-Dynamips + WinPcap + SecureCRT
- acrobat缺少字体 adobe_PDF 字体
- python——spilt和strip用法
- Android 新闻客户端案例
- 阿里云李飞飞:中国数据库的时与势
- word表格和后面的文字间距太小
- 结构化命令case和for、while循环
- Pandas引言(二)
- 海外跨境电商5大关键趋势,Starday带你先发制人
热门文章
- 前端学习(3104):react-hello-react案例
- 前端学习(3088):vue+element今日头条管理-关于接口的使用(有声版)
- 一文简述npm和cnpm和yarn的区别
- [js] 说说你对js对象生命周期的理解
- 工作186:实际案例解决vue+el-element二级联动,选项选择后不显示的问题
- 工作总结17:组件封装思想
- java面试题34下面关于程序编译说法正确的是()
- 玩转oracle 11g(38):rman备份-全库恢复
- air android 通信,Android超声波通信例子
- js计算数组中每个元素出现的次数(2种方法)