自定义多列排序: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 ...
随机推荐
- 获取assemblies信息in .net core
using System; using System.Linq; using System.Reflection; using System.Runtime.Loader; using Microso ...
- text
链接: 初识 TextKit 如何实现自己没实现过的需求之文本动画
- windows Server 2008各版本区别详解
Windows Server 2008 是专为强化下一代网络.应用程序和 Web 服务的功能而设计,是有史以来最先进的 Windows Server 操作系统.拥有 Windows Server 20 ...
- Shell脚本语法
索引 1. 第一行必须是"#!/bin/sh" 2. 注释:一行开头为 # 3. 定义变量 4. 逻辑符号 5. 接收参数 6. 控制流:if/then/elif/else/f ...
- Html5 Egret游戏开发 成语大挑战(八)一般性二级页面处理
在游戏中,我们一般会有各种各样的二级页面,比如游戏暂停界面或者游戏结束界面,这些界面组成了对玩家交互主要手段,在游戏开发中,对于这些界面的coding组织是非常有学问的,如果倒退到十年前,游戏开发的老 ...
- ${pageContext.request.contextPath}无效
发现在Tomcat7.0.58,在jsp页面使用${pageContext.request.contextPath}获取不到项目名称,网上找了很多答案试了都无效: 把Tomcat版本换成Tomcat7 ...
- warning: #870-D: invalid multibyte character sequence
warning: #870-D: invalid multibyte character sequence2011-03-12 9:18warning: #870-D: invalid multiby ...
- js的数组
转载:http://blog.163.com/sammer_rui/blog/static/846200442010717900634/ https://developer.mozilla.org/z ...
- WebHeaderCollection 类
https://msdn.microsoft.com/zh-cn/library/system.net.webheadercollection(v=VS.95).aspx /// <summar ...
- [BZOJ 1997][HNOI2010]Planar(2-SAT)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1997 分析: 考虑每条边是在圈子里面还是圈子外面 所以就变成了2-SAT判定问题了= ...