自定义多列排序: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 ...
随机推荐
- http协议(三)几种数据传输方式
说说http协议的一些特点: 1)无状态 http协议是一种自身不对请求和响应之间的通信状态进行保存的协议,即无状态协议. 这种设置的好处是:更快的处理更多的请求事务,确保协议的可伸缩性 不过随着we ...
- gedit脚本
明天ctsc,赶紧学了一下gedit的配置 以下假设你只在/home/zzq下写代码(用户名自己改) 首先在/home/zzq下建一个runner.sh,内容如下: #!/bin/bash echo ...
- RPM方式编译升级centos内核
[root@iZ2893wjzgyZ ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org [root@iZ2893wjzgyZ ...
- PAT 1017. A除以B (20)
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中依次给出A和B,中间以1空格分隔. 输出格 ...
- mac: vmware fusion中cent os启动假死的解决办法
环境: mac os X 10.9.2 + vmware 6.0.2 + cent OS 6.5 minimal 现象: Booting CentOS (2.6.32-358.e.l6.i686) i ...
- TinyFrame升级之一:框架概览
由于之前的TinyFrame多于简单,并且只是说明原理,并无成型的框架出来,所以这次我把之前的知识进行了汇总,然后做出了这一版的TinyFrame框架. 整个框架的结构如下: TinyFrame.Da ...
- C# WebApi Xml序列化问题解决方法:“ObjectContent`1”类型未能序列化内容类型“application/xml;charset=utf-8"的响应正文。...
在调试一个WebApi程序时,出现下面错误: 通过分析怀疑是未添加序列化属性引起的,实体类改为下面结构后,问题依旧: 通过查阅资料和不断尝试,修改实体类的属性注解搞定:
- swift---不同字体大小不同颜色label富文本设置
agreeDeal = UILabel() //富文本,不同字体颜色大小和颜色 let labelString = "登录注册,表示您同意<服务条款及隐私政策>"as ...
- Expression Blend4经验分享:文字公告无缝循环滚动效果
这次分享一个类似新闻公告板的无缝循环滚动效果,相信很多项目都会应用到这个效果.之前我也百度了一下,网上的一些Silverlight的文字或图片滚动效果,都是一次性滚动的,如果要做到无缝循环滚动,多数要 ...
- unity3d Vector3.Lerp解析
Vector3.Lerp:http://www.ceeger.com/Script/Vector3/Vector3.Lerp.html 手册中描述的不是很详细,什么叫“按照数字t在from到to之间插 ...