三维排序(将书以Name、Year、Price进行排序
来源:互联网 发布:小米6陶瓷版 知乎 编辑:程序博客网 时间:2024/06/14 14:43
Jim很喜欢读书,他有很多数,有时候他很难管理它们。因此,他请求你的帮助来解决这个问题。
Jim想以书名、出版年份和价格为关键字,按照排序标准把书进行排序。一本书由书名Name、出版年份Year和单价Price组成。Name是第一排序标准,Year是第二排序标准,Price是第三排序标准。如果排序标准是Year,且两本书的Year相同,那么,你就应该给它们按Name排序。如果Name还是相同,那么,就应该安Price排序。不存在两本书的三个参数都相同的情况。
解题思路:本题是三维排序问题。Name、Year和Price分别是默认是第一、第二和第三排序。但本例又很特殊,第一排序是由输入指定的,是Name、Year和Price三者之一。
当Name是排序标准,那么,三个排序顺序是Name、Year和Price;
当Year是排序标准时,三个排序顺序是Year、Name和Price;
当Price是排序标准时,三个排序顺序是Price、Name和Year。
对于这三种排序标准,我们编写三个比较函数,这样就显得比较灵活,程序实现起来也比较容易。
而书的信息,则写到一个结果体变量中,而结果体变量又作为向量的元素,最后,只要根据排序标准,在排序算法中选择相应的比较函数,就完成了书的排序了。这里选用“泛型编程”来实现。
//BookSort.cpp
#include <fstream>#include <iostream>#include <vector>#include <string>#include <algorithm>using namespace std;//Book的结构体struct Book{ string Name; int Year; int Price;};//比较函数,Name主序bool CompName(const Book &b1,const Book &b2){ if(b1.Name != b2.Name) return b1.Name < b2.Name; else if(b1.Year != b2.Year) return b1.Year < b2.Year; else return b1.Price < b2.Price;}//比较函数,Year主序bool CompYear(const Book &b1,const Book &b2){ if(b1.Year != b2.Year) return b1.Year < b2.Year; else if(b1.Name != b2.Name) return b1.Name < b2.Name; else return b1.Year < b2.Year;}//比较函数,Price主序bool CompPrice(const Book &b1,const Book &b2){ if(b1.Price != b2.Price) return b1.Price < b2.Price; else if(b1.Name != b2.Name) return b1.Name < b2.Name; else return b1.Year < b2.Year;}int main(int argc, char* argv[]){ //ifstream cin("aaa.txt"); vector<Book> v; Book book; string sorting; //第一排序 int n; int i; int line=0; while(cin>>n){ if(n==0) break; line++; //案例号 v.clear(); //清空向量 //读入一个案例数据到向量中 for (i=0;i<n;i++) { cin>>book.Name>>book.Year>>book.Price; v.push_back(book); } //读入排序标准 cin>>sorting; //给向量排序,要根据主序来确定比较函数 if(sorting == "Name") sort(v.begin(),v.end(),CompName); else if(sorting == "Year") sort(v.begin(),v.end(),CompYear); else if(sorting == "Price") sort(v.begin(),v.end(),CompPrice); //输出结果 if(line != 1) cout<<endl; //不是第一行,先输出一个空行 for (i=0;i<v.size();i++) { cout<<v[i].Name<<" "<<v[i].Year<<" "<<v[i].Price<<endl; } } return 0;}
效果如下:
1 0
- 三维排序(将书以Name、Year、Price进行排序
- 如何以list进行排序
- 选择排序方式将图书进行排序
- 将三个数进行排序
- Comparator:将对象进行排序
- 将一个字段中以符号分隔的多个数字进行排序显示
- 将map按值进行排序
- 将一串字符串进行从小到大排序
- thinkphp将名字按首字母进行排序
- 将一个容器中的数进行排序
- 使用comparator 将对象数组进行排序
- ZOJ 3202Second-price Auction(排序)
- 用Javascript以类的方式进行冒泡排序
- 以 公有成员为准 对class进行排序
- list集如何以某个字段对list进行排序
- 【JAVA语言基础】map以value进行排序
- php二维数组以某个键进行排序
- 将iPhone的通讯录以拼音排序(转载文章)
- Linux里设置环境变量的方法(export PATH)
- C#向上转型与向下转型
- list-each-while遍历数组 和使用foreach的对比
- A+B for Input-Output Practice (I)
- 保护视力,从改变eclipse编辑器样式风格做起
- 三维排序(将书以Name、Year、Price进行排序
- hdu1241 Oil Deposits
- SPSS 文本值在当前服务器区域不可映射解决办法
- bsh(BeanShell)动态执行java代码
- crontab设置脚本环境变量
- poj 1741 点分治论文题
- c#单例模式的简单学习
- 啥?
- 通过MathJax在页面上显示微积分等数学公式