2015-12-19 43 views
1

所以我想按不同的標準排序數組,但這裏出現問題,當兩個項目具有相同的值,我想命名它的名稱。讓我用一個例子解釋: 我有這樣的:錯誤的功能排序在一個數組

俄亥俄州49

威斯康星州46

肯塔基州46

這將是我的數據結構:

const int US_STATES = 51; 
const int MAX_INFO = 5; 

struct Info{ 
    double values; 
    int units, shipments; 
}; 

typedef Info TaulaQuarters[MAX_INFO]; //Where TaulaQuarters[0] és el total i TaulaQUarters[1..4] son els trimestres 

struct Estat{ 
    string stateName,code; 
    int population; 
    TaulaQuarters taulaQuarters; 
    int totalPopulation; 
}; 

typedef Estat TaulaEstats[US_STATES]; 

所以,威斯康星州和肯塔基州有相同的價值,但我想肯塔基州下的威斯康星州,因爲肯塔基州比威斯康星州字母大ically。 讓我告訴你我的主要排序操作:

bool esMajor (double n1, double n2, string nom1, string nom2, char criteri) 
{ 
    //pre: 
    //lpost: 
     int enter1 = int(n1); 
     int enter2 = int(n2); 

     bool hoEs = false; 
     if (criteri == 'v'){ 
      if (n1 > n2) hoEs = true; 
      else if (n1 == n2){ 
       if (nom1 > nom2) hoEs = true; 
      } 
     } 
     else if (criteri == 'u' or criteri == 's'){ 
      if (enter1 > enter2) hoEs = true; 
      else if (enter1 == enter2){ 
       if (nom1 < nom2) hoEs = true; 
      } 
     } 
     else if (criteri == 'n'){ 
      if (nom1 < nom2) hoEs = true; 
     } 
     //else if() 
     return hoEs; 
} 
void ordena (TaulaEstats taulaEstats, char criteri) 
{ 
    //Pre: 
    //post: 
     //----Intializing---- 
     Estat aux; aux.code = "--"; aux.population = 0; aux.stateName = "--"; aux.totalPopulation = 0; 
     for (int x = 0; x < 5; x++){ 
      aux.taulaQuarters[x].shipments = 0; aux.taulaQuarters[x].units = 0; aux.taulaQuarters[x].values = 0; 
     } 
     //-------END--------- 
     for (int i = 0; i < int(US_STATES);i++){ 
      int j = i; 
      //if (criteri == 'v'){ 
       while (j > 0 and esMajor(taulaEstats[j].taulaQuarters[0].values,taulaEstats[j-1].taulaQuarters[0].values,taulaEstats[j].stateName, taulaEstats[j-1].stateName, criteri)){ 
        aux = taulaEstats[j-1]; 
        taulaEstats[j-1] = taulaEstats[j]; 
        taulaEstats[j]= aux; 
        j--; 
       } 
      } 
} 

esMajor會告訴我根據的標準,如果第一個數字比第二個大,在同等情況下,會如果第一個告訴我名字大於第二個。 和ordena只是我必須對我的數組進行排序的算法。

感謝您的幫助和節日快樂!

(對不起,我的英語雖然)。

回答

0

如果這是C++,則應該在您的結構中封裝數字和名稱,併爲您的類重載比較運算符。像這樣:

struct StateInfo 
{ 
    std::string stateName; 
    int stateNumber; 

public: 
    StateInfo() : stateName("DEFAULTNAME"),stateNumber(0){} 

    StateInfo(std::string name, int, number): stateName(name),stateNumber(number){} 


    bool operator< (const StateInfo& rhs) 
    { 

     if(rhs.stateNumber==this->stateNumber) 
     { 
      return rhs.stateName< this->stateName; //if numbers are equal compare by name 
     } 
     return rhs.stateNumber<this->stateNumber; 
    } 

    //overload other operators as necessary 


} 

現在你可以使用std::sort#include <algorithm>排序所有對象,你放在一個容器中,如std::vector的。

解決方案的要點是讓std :: sort知道如何比較結構的2個不同實例。當std :: sort知道這一點時,它可以爲你排序。

走陣列路線非常混亂,不推薦。

如果您有興趣製作自己的排序算法或練習插入排序,合併排序,快速排序等,那麼您仍然可以使用重載運算符> < == < =和> =來編寫自己的排序算法。

+0

我不能使用sort命令,並不得不開發對我自己,我不會使用對象,所以我還挺有沒有你在說什麼:( – magalenyo

+1

的想法你。在你的代碼結構定義您與對象 – ForeverStudent

0

如果這兩個數字是相同的,你只需要把他們的名字,然後應用該算法

if(name1[0]>name2[0]){ 
    //Name1 is alphabetically greater place it first in the queue 
} 
else if(name1[0]<name2[0]){ 
    //Name2 is alphabetically greater place it first in the queue 
} 
else{ 
    //Both are equal. Do what you want. 
} 
0

你的代碼是有點雷區的,但你可以實現你想要像這樣的東西是什麼:

#include <vector> 
#include <tuple>  // std::pair 
#include <algorithm> // std::sort 
#include <iterator> // std::begin, std::end 
#include <iostream> 

using StateInfo = std::pair<int, std::string>; 
using CountryInfo = std::vector<StateInfo>; 

int main() 
{ 
    CountryInfo usa_info {{49, "Ohio"}, {46, "Wisconsin"}, {46, "Kentucky"}}; 

    std::sort(std::begin(usa_info), std::end(usa_info)); 

    for (const auto& d : usa_info) std::cout << d.second << " " << d.first << std::endl; 

    return 0; 
} 

這工作,因爲std::pair已經超載operator<和排序第一,然後再第二個元素。如果您不想使用std::pair,則可以爲自己的班級重載operator<

+0

工作,我不能從庫中使用的算法,我必須讓我自己:秒,這是行不通的,我還挺想現在就殺了自己lmaokai – magalenyo