• 自定义多列排序: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
    ",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
    ",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 }
  • 相关阅读:
    【PAT甲级】1063 Set Similarity (25 分)
    【PAT甲级】1062 Talent and Virtue (25 分)
    【PAT甲级】1061 Dating (20 分)
    Codeforces Global Round 5E(构造,思维)
    Codeforces Round #592 (Div. 2)G(模拟)
    POJ 刷题进程.1
    登录页面 (带遮罩层的) ---2017-04--5
    回答: 2017-03-19的关于css+div布局的疑问 2017-04-05
    关于js高度和宽度的获取 ----2017-03-29
    如何用写js弹出层 ----2017-03-29
  • 原文地址:https://www.cnblogs.com/SeaSky0606/p/4734239.html
Copyright © 2020-2023  润新知