【发布时间】:2015-09-07 13:45:16
【问题描述】:
我的任务是根据用户输入对 csv 文件进行排序
数据如下:
California,USA,65,76,65,67
Paris,France,78,65,97,87
Tokyo,Japan,56,78,67,87
New York,USA,54,65,67,44,67
或者基本上列代表
City,Country,q1 average temperature, q2 average temperature, q3 , q4
我的任务是根据列对其进行排序:城市作为第 1 列,国家/地区第 2 列,依此类推...取决于用户输入。
所以如果用户输入是1dec,这意味着它将按第一列排序(在这种情况下按字母顺序)并打印排序后的数据
对于上面的示例,它将打印为:
Tokyo,Japan,56,78,67,87
Paris,France,78,65,97,87
New York,USA,65,67,67,44,67
California,USA,65,76,65,67
用户还可以输入多个输入,例如2asc,3dec,4dec,这意味着第 2 列将首先按升序排序,如果该列中有相似的数据,则将使用第 3 列显示它们降序,那么如果它仍然是相同的使用第 4 列。
对于上面的示例,如果使用2asc,3dec,4dec 调用,它将打印为:
Paris,France,78,65,97,87
Tokyo,Japan,56,78,67,87
California,USA,65,76,65,67
New York,USA,65,67,67,44,67
我的问题是,我应该如何解决这个问题? 我应该使用哪种数据结构最好?
PS。不是真的要求代码示例,但我只是要求一些提示 或如果您遇到此类问题的方法
【问题讨论】:
-
不打算为你做作业.. 到目前为止你有什么?
-
创建一个包含 csv 行的结构体,将其放入 stl 容器中,创建一个函子来检查结构体的两个实例之间的字典顺序,并在容器中使用
std::sort。 -
@XDProgrammer 1) Jepessen 的建议似乎正是您所需要的。 2)有一个经验法则:如果您不知道哪种类型的容器更好 - 使用
std::vector -
排序有点棘手:我建议如果你将数据放入
struct X,添加一个函数int compareColumn(int column_num, const X& rhs) const,如果*this的值在列中返回-1column_num小于rhs's,0如果它们相等,否则1。然后,您可以编写一个使用compareColumn函数三次的bool less(int column_num_A, bool ascending_A, int column_num_B, bool ascending_B, int column_num_C, bool ascending_C);。 (可以通过采用列号/升序标志的vector<pair<int, bool>>来进一步概括。) -
如果您选择尝试
vector<vector<string>>,请注意一点——您可能需要对数字列进行一些额外处理以避免string的词法比较:例如"10" < "2".