按成员降序对多个对象进行排序?

     2023-02-21     181

关键词:

【中文标题】按成员降序对多个对象进行排序?【英文标题】:Sorting Multiple Objects By Member in Descending Order? 【发布时间】:2013-05-31 12:23:14 【问题描述】:

我看过以下问题:按对象的属性对对象向量进行排序

这似乎与我的情况非常相关。我有少量 Player 对象(6-10 个),它们都有诸如名称和一些相关统计信息之类的信息。我想按一个特定的统计数据按降序对它们进行排序。

仍然很困惑

请帮忙!

编辑:下面是完整更新的代码

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

 class Player 
 public:
Player(string name, int Dex, int Mod, int Lvl, int& diceRoll);

int calcInitiative(int& diceRoll);

int diceRoll;

friend ostream& operator<<(ostream& out, const Player& player) 
    return out << player.mName << " " << player.mInitiative; 
    

bool operator<(const Player& rhs) const 

 if(mInitiative < rhs.mInitiative) return true;

     if(mInitiative > rhs.mInitiative) return false;

     if(mInitiative == rhs.mInitiative) return false;



int mDex, mMod, mLvl, mInitiative;
 string mName;
 ;

Player::Player(string name, int Dex, int Mod, int Lvl, int& diceRoll)
: mName(name), mDex(Dex), mMod(Mod), mLvl(Lvl)



 int Player::calcInitiative(int& diceRoll) 

return (mLvl/2) + mDex + mMod + diceRoll;
 

 int main() 

 int rollD, rollS; // etc.

 vector<Player> playerVec;

 cout << "Derek rolled: ";
 cin >> rollD;
 cout << '\n' << "Scott rolled: ";
 cin >> rollS;

// etc.


Player Derek("Derek", 2, 0, 6, rollD);
Player B("B", 2, 0, 9, rollB);

// etc...

Derek.mInitiative = Derek.calcInitiative(rollD);
Scott.mInitiative = Scott.calcInitiative(rollS);

//etc.

playerVec.push_back(Derek);
playerVec.push_back(Scott);

// etc.

cout << "The initative order is: " << '\n';

sort (playerVec.begin(), playerVec.end());

for(vector<Player>::iterator it = playerVec.begin(); it != playerVec.end(); ++it) 
cout << *it << endl;


system("pause");

return 0;

【问题讨论】:

如果您只想按一种属性组合进行排序,只需重载 std::sort 使用 Quicksort 算法进行排序 重载 @Rome_Leader:正如在那个问题中所澄清的那样,operator&lt; 与您对cout 陈述的困难没有任何关系 它一直中断我的解释,但基本上,仍然在努力弄清楚 operator 【参考方案1】:

您几乎已经编写了所有代码。

在您的 Player 类中,添加以下函数:

bool operator<(const Player& rhs) const;

如果this 小于右侧,则使其返回true。类似于您的上一个代码块。

现在运行:

sort(myVec.begin(), myVec.end());

这将进行就地排序。

编辑:这是一个完全可编译的示例,展示了它们如何协同工作:

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

class Player

public:
        Player(int stat1, int stat2) : m_stat1(stat1), m_stat2(stat2) 

        bool operator<(const Player& rhs) const 
                if(m_stat1 < rhs.m_stat1) return true;
                if(m_stat1 > rhs.m_stat1) return false;
                return m_stat2 < rhs.m_stat2;
        

        friend ostream& operator<<(ostream& out, const Player& player) 
                return out << player.m_stat1 << ", " << player.m_stat2;
        

private:
        int m_stat1, m_stat2;
;

int main()

        vector<Player> aPlayers;
        aPlayers.push_back(Player( 1, 2 ));
        aPlayers.push_back(Player( 1, 1 ));
        aPlayers.push_back(Player( 5, 0 ));

        std::sort(aPlayers.begin(), aPlayers.end());

        for(vector<Player>::iterator it = aPlayers.begin();
                        it != aPlayers.end(); ++it)
        
                cout << *it << endl;
        

输出:

1, 1
1, 2
5, 0

我把 operator

编辑 2:在您的新代码中,您提到编译器给您一个错误。该错误很可能是因为无法确定代码是否会返回值。如果您将return false 添加到operator&lt; 的末尾,它将停止给您一个错误。这也会使您的operator&lt; 中的第三行变得多余。

就结果的倒序而言,sort 默认按升序排序。有几个非常简单的方法可以解决这个问题。最明显的是重写operator&lt; 以生成您喜欢的排序。一个更通用的选择是将反向迭代器提供给 std::sort 而不是默认的迭代器:

std::sort(aPlayers.rbegin(), aPlayers.rend());

rbegin()rend() 就像 begin()end() 一样,只是它们相反。

【讨论】:

啊,我明白了!所以这个重载,连同我的另一个重载,将阻止在元素已经处于正确顺序的情况下切换! 您不需要任何其他重载,只需operator&lt;。 std::sort 将自动为您完成其余的工作;每当它发现两个无序的元素时,它就会对这两个元素调用 std::swap ,最终得到一个有序的向量。 仍有一些困难。由于过载,cout 的双尖括号 ( @Rome_Leader:问题中的示例是否澄清了您的困惑? 我肯定会到达那里。很有帮助。不过,我对 【参考方案2】:

通过使用提供的谓词(在您的情况下这是一个函子)对向量调用 std::sort,您已经在交换您的玩家。

在您的示例中,在 myVec 上调用 sort 后,您将拥有 Player 的向量,或者任何 T 按属性 x 降序排序。

所以我看不出手动切换/交换任何东西的目的。

【讨论】:

所以你认为像上面这样的排序调用,按 Player 的属性 .stat 排序会切换对象本身吗?如果是这样,那将非常有用。然后我可以简单地将它们的 .stat 值按顺序输出给用户。 这正是排序的用途。正如 Rick 指出的那样,在 Player 类中用 operator 啊,好的。对不起我的困惑。我现在无法测试,但我认为它应该会成功,并且比我之前的尝试有了很大的改进。

如何按升序和降序对列进行排序?

】如何按升序和降序对列进行排序?【英文标题】:howsortcolumnsinascendinganddescendingorder?【发布时间】:2020-11-0902:46:18【问题描述】:我使用对象数组创建了表,现在我不明白我们如何通过单击reactjs中的列名按升序和降序对表进行... 查看详情

按降序对对象数组进行排序[关闭]

】按降序对对象数组进行排序[关闭]【英文标题】:sortarrayofobjectsindescendingorder[closed]【发布时间】:2012-12-0900:20:21【问题描述】:我正在使用定义的“newsFeed”对象的堆数组来实现优先级队列,这些对象都有一个字符串、一个“... 查看详情

如何按降序对列表视图项进行排序

】如何按降序对列表视图项进行排序【英文标题】:Howtosortlistviewitemsindescendingorder【发布时间】:2013-08-1319:04:38【问题描述】:所以我有一个列表视图,我想在其中按降序对NumberOfRecords进行排序。我有一个自定义数组适配器,但... 查看详情

如何按降序对列表进行排序

】如何按降序对列表进行排序【英文标题】:Howtosortthelistbydescendingorder【发布时间】:2022-01-0605:54:27【问题描述】:publicclassItemspublicstringNameget;set;publicintIdget;set;publicList<string>SubItemsget;set;上面是我的课。在我的代码中的某处... 查看详情

如何按降序对 ListView.builder 进行排序?

】如何按降序对ListView.builder进行排序?【英文标题】:HowtosortListView.builderindecreasingorder?【发布时间】:2021-07-2607:54:02【问题描述】:我想按降序排列View.builder你能帮我吗?ListView.builder(itemCount:..,itemBuilder:(BuildContextcontext,inti)..)... 查看详情

按降序对数组进行排序的更好方法

】按降序对数组进行排序的更好方法【英文标题】:Betterwaytosortarrayindescendingorder【发布时间】:2011-07-2217:58:09【问题描述】:我有一个int数组,我必须按降序排序。由于我没有找到任何按降序对数组进行排序的方法。目前我正... 查看详情

如何按降序对 JSON 数组元素进行排序? [复制]

】如何按降序对JSON数组元素进行排序?[复制]【英文标题】:HowtosortJSONarrayelementsindescendingorder?[duplicate]【发布时间】:2019-06-0616:42:53【问题描述】:在我的index.html中,我按以下顺序从服务器接收数据:[id:1,keyOne:valueOne,keyTwo:value... 查看详情

如何按日期降序对数据表进行排序

】如何按日期降序对数据表进行排序【英文标题】:Howtosortdatatableswithdateindescendingorder【发布时间】:2016-10-1507:33:02【问题描述】:我希望使用数据表显示记录,默认排序基于我的行之一,日期和时间按降序排列。请帮助我为此... 查看详情

按特定索引降序对数组进行排序[重复]

】按特定索引降序对数组进行排序[重复]【英文标题】:Sortinganarrayofarraysbyspecificindexdescending[duplicate]【发布时间】:2018-05-2616:12:29【问题描述】:我有下面的数组Array([Prod1]=>Array([0]=>$1,167,788.03[1]=>26,872[2]=>73.42[3]=>19.0%[4... 查看详情

按升序或降序对数字或字母进行通用排序

】按升序或降序对数字或字母进行通用排序【英文标题】:GenericSortforNumberorAlphabetinAscendingorDescendingOrder【发布时间】:2019-07-1716:55:32【问题描述】:如何对只能包含字母或数字的通用数组进行排序?假设我有一个仅包含数字的... 查看详情

如何在 Reactjs 中按升序或降序对数据进行排序?

】如何在Reactjs中按升序或降序对数据进行排序?【英文标题】:HowtosortdatainascendingordescendingorderinReactjs?【发布时间】:2018-10-0915:02:12【问题描述】:我在我的显示组件中导入了产品数据。对于JSON中的每个产品,我使用.map()来显... 查看详情

按特定键的降序对字典列表进行排序[重复]

】按特定键的降序对字典列表进行排序[重复]【英文标题】:Sortingthelistofdictionariesindescendingorderofaparticularkey[duplicate]【发布时间】:2017-02-2806:05:44【问题描述】:我有一个python字典列表,例如[\'a\':3,\'b\':4,\'c\':5,\'d\':\'6\',\'a\':1,\'b\... 查看详情

如果JS中存在值,如何根据日期按降序对数组进行排序?

】如果JS中存在值,如何根据日期按降序对数组进行排序?【英文标题】:HowtosortarraybasedondateindescendingorderifvalueexistsinJS?【发布时间】:2020-04-1217:43:45【问题描述】:我正在尝试根据publishDate的降序对数据进行排序,但它不起作... 查看详情

如何按降序对 ArrayList<Long> 进行排序?

】如何按降序对ArrayList<Long>进行排序?【英文标题】:HowtosortArrayList<Long>indecreasingorder?【发布时间】:2011-08-1904:26:20【问题描述】:如何在Java中对ArrayList&lt;Long&gt;进行降序排序?【问题讨论】:【参考方案1】:... 查看详情

Firebase 按降序对数据进行排序。 (只排序了一半。)

】Firebase按降序对数据进行排序。(只排序了一半。)【英文标题】:Firebasesortingdataindescendingorder.(onlyhalfsorted.)【发布时间】:2018-05-2101:47:16【问题描述】:我正在尝试按值将我的列表视图排序为降序。我试过使用Collections.reverse... 查看详情

按降序对单链表进行排序

】按降序对单链表进行排序【英文标题】:SortSingleLinkedListindescendingorder【发布时间】:2016-10-1619:57:23【问题描述】:如何按分数降序显示此链接列表?当我在我的GUI中显示它以按顶部的最高分排序,然后降到底部的最低分时,... 查看详情

如何按日期降序对 NSDate 进行排序,但在该日期内时间升序?

】如何按日期降序对NSDate进行排序,但在该日期内时间升序?【英文标题】:HowtosortNSDatebydatedescending,butwithtimeascendingwithinthatdate?【发布时间】:2012-07-1907:30:33【问题描述】:我使用NSFetchedResultsController和NSSortDescriptor成功排序到... 查看详情

按 C 中元素出现频率的降序对数组进行排序

】按C中元素出现频率的降序对数组进行排序【英文标题】:SortthearrayindecreasingorderoffrequencyofoccurrenceofelementsinC【发布时间】:2013-10-0810:13:44【问题描述】:问题是根据元素出现的频率对数组进行排序。例如,如果输入数组是2,3,2,... 查看详情