自定义多列排序:C++/Java实现
前言:
有些时候,我们在编程中会遇到多列排序的需求。假如在execle,这事儿就太easy了。不过没办法,现在就需要你用Java或者C++实现这样一个功能!
比如将下表无序的数据通过重排之后按照以下规则显示结果:
1.第二列从大到小排列
2.若第二列相等,则第一列按照从小到大排序
排序前 |
排序后 |
2 5 |
21 101 |
-------------------------------------
C++实现一:运算符重载
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- using namespace std;
- const int maxn = 1e4+;
- struct Job{
- int x,y;
- bool operator < (const Job &j) const { //operator
- if(y==j.y){
- return x < j.x;
- }
- return y > j.y;
- }
- };
- int main(){
- // 从文件读入
- freopen("datain.txt","r",stdin);
- freopen("dataout.txt","w",stdout);
- int n,x,y;
- while(scanf("%d",&n)== && n){
- vector<Job> v;
- for(int i=;i<n;i++){
- scanf("%d%d",&x,&y);
- v.push_back(Job{x,y});
- }
- sort(v.begin(),v.end());
- //输出
- for(int i=;i<n;i++){
- printf("%d %d\n",v[i].x,v[i].y);
- }
- }
- return ;
- }
C++实现二:重写cmp()比较函数
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- const int maxn = 1e4+;
- struct Job{
- int x,y;
- };
- bool cmp(Job j1,Job j2){
- if(j1.y==j2.y)
- return j1.x < j2.x;
- return j1.y > j2.y;
- }
- Job A[maxn];
- int main(){
- //将数据从文件读入
- freopen("datain.txt","r",stdin);
- int n;
- while(scanf("%d",&n)== && n){
- for(int i=;i<n;i++){
- scanf("%d%d",&A[i].x,&A[i].y);
- }
- sort(A,A+n,cmp);
- for(int i=;i<n;i++){
- printf("%d %d\n",A[i].x,A[i].y);
- }
- }
- return ;
- }
Java实现一:实现Comparable接口,重写compareTo()方法
- package sort;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- /*
- * 重写Comparable接口的campareTo(Object o)方法
- */
- class Task implements Comparable<Task>{
- int x,y;
- public Task(int x,int y) {
- this.x=x;
- this.y=y;
- }
- @Override
- public int compareTo(Task o) {
- if(this.y==o.y)
- return this.x-o.x;
- return o.y-this.y;
- }
- @Override
- public String toString() {
- String r = this.x+" "+this.y;
- return r;
- }
- }
- public class TestCompare {
- public static void main(String[] args) {
- Task t1 = new Task(5,2);
- Task t2 = new Task(5,4);
- Task t3 = new Task(3,2);
- List<Task> tasks = new ArrayList<Task>();
- tasks.add(t1);
- tasks.add(t2);
- tasks.add(t3);
- //排序sort
- Collections.sort(tasks);
- //打印输出
- for(Task t:tasks){
- System.out.println(t);
- }
- }
- }
Java实现二:重写compare方法
- package sort;
- import java.util.ArrayList;
- import java.util.Comparator;
- import java.util.List;
- import com.gdufe.mian4.Collection;
- import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils.Collections;
- class Job {
- int x;
- int y;
- public Job(int x, int y) {
- this.x = x;
- this.y = y;
- }
- public String toString() {
- String r = this.x + " " + this.y;
- return r;
- }
- }
- public class TestCompare2 {
- public static void main(String[] args) {
- List<Job> jobs = new ArrayList<Job>();
- Job j1 = new Job(2,4);
- Job j2 = new Job(5,3);
- Job j3 = new Job(1,4);
- jobs.add(j1);
- jobs.add(j2);
- jobs.add(j3);
- //重写Comparator接口的Compare方法:先按照第二列从大到小,若第二列相等则第一列从小到大排序
- Comparator<Job> c = new Comparator<Job>() {
- @Override
- public int compare(Job o1, Job o2) {
- if(o1.y==o2.y){
- return o1.x-o2.x;
- }
- return o2.y-o1.y;
- }
- };
- System.out.println("输出排序后的结果:");
- java.util.Collections.sort(jobs, c);
- for(Job job:jobs){
- System.out.println(job);
- }
- }
- }
自定义多列排序:C++/Java实现的更多相关文章
- Java基础知识强化之集合框架笔记69:Collections类之ArrayList存储自自定义对象并排序的案例
1. ArrayList存储自自定义对象并排序的案例: ArrayList存储自自定义对象,并使用Collections对ArrayList存储基本包装类的元素排序. 2. 代码实现: (1)Stud ...
- Java 多维数组 按某列 排序
public MetaCell[][] getByColumn(final int columnIndex, int decisionIndex) {//[注意]final咯 ...
- EasyUI扩展——自定义列排序匹配字段
一些特殊情况下希望实现:单击某些列,但是排序要按照自定义指定另外的列排序 easyui扩展: 如果不写sort属性则按照默认该列的field排序 $.fn.datagrid.defaults.onBe ...
- DataGridView的自定义列排序
1,将需要进行排序的列做属性的设置 this.colUserName.SortMode = DataGridViewColumnSortMode.Programmatic; 2,添加列的事件 //点击 ...
- Jtable 表格按多列排序(支持中文汉字排序)
这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...
- Hadoop学习之自定义二次排序
一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往 往有要对reduce输出结果进行二次排 ...
- 重写Oracle的wm_concat函数,自定义分隔符、排序
oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...
- Spark基础排序+二次排序(java+scala)
1.基础排序算法 sc.textFile()).reduceByKey(_+_,).map(pair=>(pair._2,pair._1)).sortByKey(false).map(pair= ...
- 几种经典的数据排序及其Java实现
选择排序 思想 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: ①初始状态:无序区为R[1..n],有序区为空. ②第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k ...
随机推荐
- Android屏幕禁止休眠的方法
实现这一功能的方法有两种,一种是在Manifest.xml文件里面声明,一种是在代码里面修改LayoutParams的标志位.具体如下: 1.在Manifest.xml文件里面用user-permis ...
- UILabel顶部对齐解决方法(转载)
问题 我有一个UILabel高度最多能显示两行,如果里面内容只有一行,它是垂直居中的.怎么能让它顶端对齐呢? 回答 答案1:用sizeToFit改变UILabel的高度 nevan king,19 ...
- UIScrollView解决无法触发手势
//创建一个分类 //.h #import <UIKit/UIKit.h> @interface UIScrollView (Touch) - (void)touchesBegan:(NS ...
- document.readyState等属性
document.readyState:判断文档是否加载完成.firefox不支持. 这个属性是只读的,传回值有以下的可能: 0-UNINITIALIZED:XML 对象被产生,但没有任何文件被加载. ...
- django复习笔记3:urls/views/templates三板斧
0.先看看文件结构 mysite/ mysite/ ├── __pycache__ │ └── manage.cpython-.pyc ├── blog │ ├── __init__.py │ ...
- Regular Expression Matching
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- [TED] New video technology that reveals an objects hidden properties
通过视频中,即使1微米的震动,都能够还原成声音. 程序算法结合基础学科,能够发挥出接近无限的力量, 深入挖掘物理特性,形成你想都想不到的效果. 很多技术你都不知道,怎么和国家对抗?所以还是要遵纪守法 ...
- Android -- 桌面悬浮,QQ管家火箭实现
续上一篇博客<Android -- 桌面悬浮,仿360>,传送门:http://www.cnblogs.com/yydcdut/p/3909888.html,在此代码上继续添加实现. 比起 ...
- 安装包制作工具 SetupFactory使用1 详解
2014-11-19 Setup Factory 是一个强大的安装程序制作工具.提供了安装制作向导界面,即使你对安装制作不了解,也可以生成专业性质的安装程序.可建立快捷方式,也可直接在 Windows ...
- SQL基础之XML
1.XML数据类型 在SQL Server中xml数据类型可以用来保存xml文档,这个文档即可以是完整的xml文档和xml片段,这样开发者就可以像使用int数据类型一样来使用xml数据类型.不过xml ...