自定义多列排序: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 ...
随机推荐
- 表单事件onsubmit与onreset
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- offsetParent详解
offsetParent与parentNode一样,都是获取父节点,但是offsetParent却有很大的不同之处: offsetParent找有定位的父节点,没有定位默认是body,ie7以下定位在 ...
- ubuntu系统下的防火墙使用
apt-get install ufw 安装防火墙sudo ufw enable|disable|status 开启/关闭/查看防火墙状态sudo ufw allow 22/ ...
- GT考试(bzoj 1009)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...
- Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例
概要 这一章,我们对TreeSet进行学习.我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet.内容包括:第1部分 TreeSet介绍第2部分 TreeSe ...
- DEDECMS之九 文章采集
到很多网友都为织梦(DEDECMS)的采集教程头疼,的确,官方出的教程太笼统了,什么都没说,换个网站你什么都做不了,这个教程是最详尽的教程,让你一看即会! 一.列表采集 第一步.我们打开织梦后台点击采 ...
- spring发布和接收定制的事件(spring事件传播)
spring发布和接收定制的事件(spring事件传播) 2012-12-26 20:05 22111人阅读 评论(2) 收藏 举报 分类: 开源技术(如Struts/spring/Hibernat ...
- 安卓开发:效果图中标注的像素尺寸如何转换为安卓的dp尺寸?
我们的UI基于1920x1080分辨率给的尺寸标注,但是在安卓开发中大家一般都使用dp.sp来标注界面尺寸,所以需要一个dp与sp的转换公式. 一开始参考的的这篇文章:关于Android开发中px.d ...
- Java 基础【10】 I/O流概念分析整理
转载地址:http://blog.csdn.net/yuebinghaoyuan/article/details/7388059 java.io 中的流,可以从不同的角度进行分类. 按照数据流的方向不 ...
- Linux权限
在Linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下. 语法如下: chmod [who] [+ | - | =] [mode] ...