前言:

  有些时候,我们在编程中会遇到多列排序的需求。假如在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++实现一:运算符重载

 #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实现的更多相关文章

  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. Linux打包压缩.md

    Linux下打包压缩命令 下面学习一下压缩和打包的相关命令,首先得先明确两个概念,即:压缩和打包 .我们实际使用中一般是打包和压缩结合的使用,为了学习下面简要的介绍一下压缩文件或目录的命令. 压缩:将 ...

  2. Python的高级特性9:蹩脚的多态

    学习了java再来看python的多态,总感觉怪怪的,很蹩脚.. 1.python的父类根本不能调用子类的方法,只能蹩脚的依靠重写方法,然后在运行时去调用,实现伪多态... 2.所谓的鸭子类型看起来很 ...

  3. php碎片

    1.flock LOCK_EX 独占锁定 LOCK_SH 共享锁定 LOCK_UN 解除锁定 LOCK_NB 锁定但不堵塞进程,直接返回false 2. fseek SEEK_CUR SEEK_END ...

  4. IntelliJ IDEA运行tomcat项目编码错误, 及如何指定tomcat编码

    刚开始用IDEA, 在跑dubbo开发时, 发现一个很奇怪的问题, 远程调用服务端的方法时, 传入的中文参数会变成GBK编码. 经过好长时间的跟踪终于把问题定位到了IDEA里配置的Tomcat. 凡是 ...

  5. linux基本工具使用(二)

    1 查找某个目录下面一个所有的可执行文件,并且删除(对删除一个工程的可执行文件格外有用) find . -maxdepth 1 -file f -perm -111 | xargs rm

  6. 将packages/apps/下的app导入eclipse

    当刚接触android自带的一个模块时,如何去熟悉它?相信不少人第一步都会尝试着去了解其内容的调用流程,而此时若能够单步调试则显得非常重要了,于是有了文章标题所说的尝试. 作者这里要导入的是Setti ...

  7. git 找回丢失的commit

    From : http://dmouse.iteye.com/blog/1797267 git 的错误操作,导致丢失了重要的commit,真是痛不欲生: 最后通过git神器终于找回了丢失的commit ...

  8. Linux 守护进程三

    .打开telnet工具,登录服务器,登录校验成功以后, linux服务器会在终端和服务器之间,建立一个会话期session .在这个会话期中,默认启动一个shell程序 .在会话期中有n个进程组 sh ...

  9. C# 7.0 新特性3: 模式匹配

    本文参考Roslyn项目Issue:#206,及Docs:#patterns. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# ...

  10. 探究JVM——垃圾回收

    垃圾回收主要考虑三件事情:哪些内存需要回收?什么时候回收?如何回收? 一.哪些内存需要回收? 堆内存:对于JVM 来说,垃圾回收主要是针对堆内存中的对象实例. 方法区:垃圾收集行为在方法区是比较少出现 ...