Jak seřadit hodnoty v QMap<QChar,int> – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak seřadit hodnoty v QMap<QChar,int> – C / C++ – Fórum – Programujte.comJak seřadit hodnoty v QMap<QChar,int> – C / C++ – Fórum – Programujte.com

 

ingiraxo+15
Grafoman
17. 4. 2012   #1
-
0
-

Čau, mám takový problém a nějak se nemůžu pohnout z místa... řešim seřazení mapy podle hodnot 

QMap<QChar, int> data;

Kde QChar je znak v textu a int je počet jeho výskytů a teď to potřebuju seřadit podle počtu výskytů, ale aby se mi seřadili i klíče

Seřazení hodnot vim, ale nevim jak do toho zahrnout i klíče... ty hodnoty bych seřadil takto: 

QList<int> temp = data.values();
qSort(temp);

díky :)

Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
crazy
~ Moderátor
+10
Grafoman
17. 4. 2012   #2
-
0
-
Nahlásit jako SPAM
IP: 2001:718:2:31:1e75:8ff:fe...–
All you need is vision and time.
ingiraxo+15
Grafoman
17. 4. 2012   #3
-
0
-

#2 crazy
no dobře, ale to máš pouze na nějakej kontejnér, to vim, ale mapa má 2 hodnoty a když budu porovnávat int(y), tak mi klíče zůstanou a já potřebuju aby se i klíče pohnuly společně s hodnotou

Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
crazy
~ Moderátor
+10
Grafoman
17. 4. 2012   #4
-
0
-

#3 ingiraxo
no vidíš to mi nedošlo... tak to budeš muset udělat jinak... Mapu jen tak neseřadíš podle hodnot... můžeš místo mapy použít QList< QPair<QChar, int> > a pak si tu funkci už napíšeš... a nebo si můžeš seřadit pouze hodnoty (jako QStringList) a potom klíče zjistíš QMap::key( value ) (ale asi to bude dost pomalý)

Nahlásit jako SPAM
IP: 2001:718:2:31:1e75:8ff:fe...–
All you need is vision and time.
KIIV
~ Moderátor
+43
God of flame
18. 4. 2012   #5
-
0
-

mapa pro indexaci pouziva tusim binarni strom... jak bys chtel seradit neco co musi byt serazene uz z principu, aby se v tom dalo hledat s logaritmickou casovou zavislosti? Jedeh zpusob je udelat si pole pointeru, a to seradit vlastni porovnavaci funkci

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
18. 4. 2012   #6
-
0
-

Tak jsem to vyřešil trochu jinak, možná to je trochu přes ruku, ale lepší řešení mě nenapadlo...

jsem si vytvořil struktůru pro jednotlivé znaky a jejich počet a to potom řadim dle počtu znaků

struct Letter
{
    QChar Char;
    int Count;

    Letter(const QChar chr, int count) : Char(chr), Count(count) {}

    static bool Less(const Letter left, const Letter right)
    {
        return right.Count < left.Count;
    }

    static bool Greater(const Letter left, const Letter right)
    {
        return right.Count > left.Count;
    }
};

A potom ve funkci, která to přidává a řadí to mám takto: 

void createLFL(QStringList files)
{
    for (int n = 0; n < files.size(); n++)
    {
        QMap<QChar,int> out;
        QString file = files.at(n);

        for (int i = 0; i < file.length(); i++)
        {
            int chr = (int)file.at(i).toAscii();

            if (chr >= 65 && chr <= 90 || chr >= 97 && chr <= 122)
                out[file.at(i)]++;
        }
        QList<Letter> letters;
        QMap<QChar,int>::const_iterator it = out.begin();

        for (; it != out.end(); it++)
        {
            letters.append(Letter(it.key(), it.value()));
        }
        qSort(letters.begin(), letters.end(), Letter::Greater);
        
        ...
    }
}

Pokud někoho napadne lepší řešení, jak budu rád :)

Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
vitamin+8
Grafoman
18. 4. 2012   #7
-
0
-

skus pouzit  std::priority_queue:

#define QMap map		//nemam QT :)
#define QChar char

struct Less {
	bool operator () (const QMap<QChar, int>::iterator &a, const QMap<QChar, int>::iterator &b){
		return a->second < b->second;	//toto je pre std::map
		//return a.value < b.value;		//toto bude asi pre QMap
		}
};

int main (void)
{
	priority_queue< QMap<QChar, int>::iterator, vector<QMap<QChar, int>::iterator>, Less >   zoradenie;
	
	zoradenie.push_back(/*iterator na prvok v QMape, mozes pouzit aj pointer na pair<QChar, int> ak funguje QMap ako std::map*/);
	//...
	
	cin.get();
}

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ingiraxo+15
Grafoman
19. 4. 2012   #8
-
0
-

mno nevim, asi stejně nechám to moje, tak či tak bych musel mít stejně cyklus, kterej by to cpal do jinýho pole a ta priority_queue tipuju, že to seřazuje vždy, při přidání nového prvků, takže si moc nevyberu, ale i tak dík :)

Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 127 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý