自定义多列排序: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 listView嵌套gridview的使用心得
在开发的过程中可能需要用到listview嵌套gridview的场景,但是在Android中, 不能在一个拥有Scrollbar的组件中嵌入另一个拥有Scrollbar的组件,因为这不科学,会混淆滑动 ...
- HTML 学习笔记 JavaScript (函数)
函数是由事件驱动的或者当他被调用时执行的可重复使用的代码块 实例 <!DOCTYPE html> <html> <head> <script> func ...
- 多项式FFT相关模板
自己码了一个模板...有点辛苦...常数十分大,小心使用 #include <iostream> #include <stdio.h> #include <math.h& ...
- C# 发送邮件,QQ企业邮箱测试成功
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...
- centos6下安装dedecms
几经波折,终于安装成功!!! 一.centos6下安装WDCP 1.连接linux 在百度直接搜索下载xshell,通过ssh连接 2.安装wdcp 下载安装wget http://dl.wdlinu ...
- webapp:移动端高清、多屏适配方案(zz)
来源: http://sentsin.com/web/1212.html 移动端高清.多屏适配方案 背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉 ...
- byte[] 转字符串 中文乱码
闲来无事,写了一个UWP的UDP/TCP小Demo,网上找了个网络调试助手,就兴冲冲的开始玩耍 结果“鸡同鸭讲”: 讲英文的时候大家都是abc,hello man!how are you? 讲中文的时 ...
- (十)装饰器模式详解(与IO不解的情缘)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. LZ到目前已经写了九个设计模 ...
- MPLS基础
1.1 MPLS简介 MPLS(Multiprotocol Label Switching,多协议标签交换)是一种新兴的IP骨干网技术.MPLS在无连接的IP网络上引入面向连接的标签交换概念,将第三 ...
- Android之Activity启动模式
正常模式 每个应用都有一个任务栈,任务栈中保存着已创建的Activity,先创建的Activity先入栈,栈顶是当前正在显示的activity(running),这是正常模式下的Activity的管理 ...