自定义多列排序:C++/Java实现

前言:

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

 1 #include <cstdio>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5
 6 const int maxn = 1e4+5;
 7 struct Job{
 8     int x,y;
 9     bool operator < (const Job &j) const { //operator
10         if(y==j.y){
11             return x < j.x;
12         }
13         return y > j.y;
14     }
15 };
16
17 int main(){
18     // 从文件读入
19     freopen("datain.txt","r",stdin);
20     freopen("dataout.txt","w",stdout);
21     int n,x,y;
22     while(scanf("%d",&n)==1 && n){
23         vector<Job> v;
24         for(int i=0;i<n;i++){
25             scanf("%d%d",&x,&y);
26             v.push_back(Job{x,y});
27         }
28
29         sort(v.begin(),v.end());
30         //输出
31         for(int i=0;i<n;i++){
32             printf("%d %d\n",v[i].x,v[i].y);
33         }
34
35     }
36     return 0;
37 }

C++实现二:重写cmp()比较函数

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 const int maxn = 1e4+5;
 6 struct Job{
 7     int x,y;
 8
 9 };
10 bool cmp(Job j1,Job j2){
11     if(j1.y==j2.y)
12         return j1.x < j2.x;
13     return j1.y > j2.y;
14 }
15
16 Job A[maxn];
17 int main(){
18     //将数据从文件读入
19     freopen("datain.txt","r",stdin);
20     int n;
21     while(scanf("%d",&n)==1 && n){
22         for(int i=0;i<n;i++){
23             scanf("%d%d",&A[i].x,&A[i].y);
24         }
25
26         sort(A,A+n,cmp);
27         for(int i=0;i<n;i++){
28             printf("%d %d\n",A[i].x,A[i].y);
29         }
30
31     }
32     return 0;
33 }

Java实现一:实现Comparable接口,重写compareTo()方法

 1 package sort;
 2
 3 import java.util.ArrayList;
 4 import java.util.Collections;
 5 import java.util.List;
 6
 7 /*
 8  * 重写Comparable接口的campareTo(Object o)方法
 9  */
10 class Task implements Comparable<Task>{
11     int x,y;
12
13     public Task(int x,int y) {
14         this.x=x;
15         this.y=y;
16     }
17     @Override
18     public int compareTo(Task o) {
19         if(this.y==o.y)
20             return this.x-o.x;
21         return o.y-this.y;
22     }
23     @Override
24     public String toString() {
25         String r = this.x+" "+this.y;
26         return r;
27     }
28
29 }
30 public class TestCompare {
31     public static void main(String[] args) {
32         Task t1 = new Task(5,2);
33         Task t2 = new Task(5,4);
34         Task t3 = new Task(3,2);
35
36         List<Task> tasks = new ArrayList<Task>();
37         tasks.add(t1);
38         tasks.add(t2);
39         tasks.add(t3);
40
41         //排序sort
42         Collections.sort(tasks);
43
44         //打印输出
45         for(Task t:tasks){
46             System.out.println(t);
47         }
48     }
49 }

Java实现二:重写compare方法

 1 package sort;
 2
 3 import java.util.ArrayList;
 4 import java.util.Comparator;
 5 import java.util.List;
 6
 7 import com.gdufe.mian4.Collection;
 8 import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils.Collections;
 9
10 class Job {
11     int x;
12     int y;
13
14     public Job(int x, int y) {
15         this.x = x;
16         this.y = y;
17     }
18
19     public String toString() {
20         String r = this.x + " " + this.y;
21         return r;
22     }
23 }
24
25 public class TestCompare2 {
26
27     public static void main(String[] args) {
28         List<Job> jobs = new ArrayList<Job>();
29         Job j1 = new Job(2,4);
30         Job j2 = new Job(5,3);
31         Job j3 = new Job(1,4);
32         jobs.add(j1);
33         jobs.add(j2);
34         jobs.add(j3);
35
36
37         //重写Comparator接口的Compare方法:先按照第二列从大到小,若第二列相等则第一列从小到大排序
38         Comparator<Job> c = new Comparator<Job>() {
39
40             @Override
41             public int compare(Job o1, Job o2) {
42                 if(o1.y==o2.y){
43                     return o1.x-o2.x;
44                 }
45                 return o2.y-o1.y;
46             }
47         };
48
49         System.out.println("输出排序后的结果:");
50         java.util.Collections.sort(jobs, c);
51         for(Job job:jobs){
52             System.out.println(job);
53         }
54
55     }
56
57 }
时间: 2024-10-28 23:50:03

自定义多列排序:C++/Java实现的相关文章

对自定义对象进行排序(C++/Java)

自定义了对象,如何按照自定对象中某一或多个元素对其进行排序呢?以下分别从C++和java对其进行实现. 一:C++ /* 实现对自定义的对象类型进行排序(按照其中的元素),首先将对象存放在vector中,然后利用algorithm库函数中的sort对其进行排序,需要重写排序函数以函数名 作为函数指针作为sort的第三个参数 */ #include <iostream> #include <string> #include <algorithm> #include <

EasyUI扩展——自定义列排序匹配字段

一些特殊情况下希望实现:单击某些列,但是排序要按照自定义指定另外的列排序 easyui扩展: 如果不写sort属性则按照默认该列的field排序 $.fn.datagrid.defaults.onBeforeLoad = function (e) { var opts = $(this).datagrid("options"); var colopts = $(this).datagrid("getColumnOption", opts.sortName); var

Java 多维数组 按某列 排序

public MetaCell[][] getByColumn(final int columnIndex, int decisionIndex) {//[注意]final咯        MetaCell[][] array = new MetaCell[m][2];//Entry<MetaCell, MetaCell>参考http://blog.csdn.net/sunmenggmail/article/details/8952712 和 http://www.cnblogs.com/fs

Hadoop学习之自定义二次排序

一.概述    MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往 往有要对reduce输出结果进行二次排序的需求.对于二次排序的实现,本文将通过一个实际的MapReduce二次排序例子讲述 二次排序的实现和其MapReduce的整个处理流程,并且通过结果和map.reduce端的日志来验证所描述的处理流程的正确性. 二.需求描述 1.输入数据: sort1    1 sort2    3 sort2 

重写Oracle的wm_concat函数,自定义分隔符、排序

oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我们不知道oracle中的over函数,也不知道listagg函数. 我们先来看看wm_concat函数能实现什么功能,通俗点==>列传行,如果不明白,请看下面截图(可以看到分隔符默认为','顺序也是杂乱的)          所以,接下来,我们开始重写wm_concat函数(需要注意和需要说明的地方

基本算法复习--排序(java实现)

日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 代码 /**   * 冒泡法排序<br/> * <li>比较相邻的元素.如果第一个比第二个

九大排序算法Java实现

之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂度.稳定性分类: 2.排序算法问题描述与实现 2.1冒泡排序(交换排序-稳定) [问题描述]对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 问题分析:冒泡排序,顾名思义,从前往后遍历,每次遍历在末尾固定一个最大值. 易错点:每次内层循环结束都会在末尾确定一个元素的位置,因此内层循环的判

Java排序算法-Java入门|Java基础课程

Java 排序算法 1. 课程目标 排序是任何语言都会使用到的功能之一,然成果排序的算法有很多,对空间的要求及其时间效率也不尽相同. 本文章以Java语言示例,通过对空间要求.时间效率要求,来对比各种排序算法的使用场景 2.适用对象 Java语言初学者 Java算法爱好者 3.相关概念 3.1 排序概念 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 3.2 排序算法 排序算法,就是如何使得记录按照要求排列的方法. 排序算法在很多领域得到相当地重视,尤其是在

三重for循环实现对二维数组的按列排序(JavaScript)

由C语言联想到的:三重for循环实现对二维数组的按列排序. 自己写的,水平有限,可能存在错误,忘指正~ function circle() { var a = [ [1, 4, 3, 2], [8, 6, 5, 7], [3, 7, 2, 5], [4, 8, 6, 1] ], t = 0, i, j, k; for(i = 0;i < 4;i++) { for(j = 0;j < 3;j++) { for(k = j + 1;k < 4;k++) { if(a[j][i] > a