c++ - 无法根据对象的属性值对对象数组进行排序
问题描述
该类Record
包含月、日和余额。创建记录对象数组后,我想按余额升序对其进行排序并显示它们。
然后,我想按日期升序对其进行排序并再次显示它们。
我能够按余额排序,但按日期排序时无法获得正确的顺序。
我按日期排序的方法是:
- 定义一个 isGreater 函数来比较对象
r1
和的月份的值,r2
如果月份 r1<r2 则返回 true,否则返回 false,如果 r1 月份 == r2 月份,则比较它们的日期。 - 中
sortByDate()
,实现冒泡排序和条件isGreater(arr[j],arr[j+1])
- 如果条件为真,那么 swap
预期的输出应该是:
sorting according to balance:
9 14 -104.6
12 14 -104.5
12 13 -104.5
sorting according to date:
9 14 -104.6
12 13 -104.5
12 14 -104.5
这是我的代码
#include <iostream>
using namespace std;
class Record {
private:
int month, day;
double balance;
public:
void set(int m, int d, double b) { month = m; day = d; balance = b; }
int getMonth() { return month; }
int getDay() { return day; }
double getBalance() { return balance; }
};
bool isGreater(Record r1, Record r2)
{
if (r1.getMonth() > r2.getMonth())
{
return true;
}
else if (r1.getMonth() < r2.getMonth())
{
return false;
}
else
{
if (r1.getDay() > r2.getDay())
{
return true;
}
else
{
return false;
}
}
}
void sortByBalance(Record arr[], int n)
{
int i, j;
Record temp;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (arr[j].getBalance() > arr[j + 1].getBalance())
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void sortByDate(Record arr[], int n)
{
int i, j;
Record temp;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (isGreater(arr[j], arr[j+1])); //{4.20, 3.15, 5.21, 6.21, 6.20}
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void printArr(Record arr[], int n)
{
for (int j = 0; j < n; j++)
{
cout << arr[j].getMonth() << ' ' << arr[j].getDay() << ' ' << arr[j].getBalance() << endl;
}
}
int main()
{
Record arr[30];
int n;
cout << "Enter the number of the records:" << endl;
cin >> n;
cout << "Enter the contents of each records:" << endl;
int m, d;
double b;
for (int i = 0; i < n; i++)
{
cin >> m >> d >> b;
arr[i].set(m, d, b);
}
cout << "Sort according to the balance:" << endl;
sortByBalance(arr, n);
printArr(arr, n);
cout << "Sort according to the time:" << endl;
sortByDate(arr, n);
printArr(arr, n);
}
解决方案
如果您在打开编译器警告并注意它们的情况下构建它,您会注意到行尾的杂散分号
if (isGreater(arr[j], arr[j+1]));
这有效地禁用了该检查,并且无论如何都只执行交换。
(也就是说,无论如何你都应该使用std::sort
而不是编写自己的冒泡排序。)
推荐阅读
- jboss - JBoss 7 (EAP 6) CLI 配置:在受支持的属性中找不到“队列地址”:[选择器、条目、持久]
- containers - 从有序记录集中删除一个元素 Ada
- javascript - jQuery getJSON, Autocomplete Uncaught TypeError: Cannot read property 'label' of undefined via MVC C#
- windows - 如何为 Windows 创建自定义单字节字符集?
- cron - 如何更改每个 cron 作业的主题?
- php - Symfony jms 序列化器在需要时启用
- mongodb - 如何展开进一步包含数组的数组字段
- c++11 - std::map 中的模板类型
- asp.net - asp.net webapplication 在本地主机上运行良好,但在发布到服务器后无法运行
- laravel - Laravel 5.6 Api - 搜索、排序和过滤数据列表