Avatar billede mrfux Nybegynder
18. oktober 2002 - 09:30 Der er 26 kommentarer og
1 løsning

Sortering af en del af en liste(database)

Jeg har følgende struktur:

ID
Tekst

Jeg har sorteret min liste ud fra ID (flere records kan godt have samme ID, da de er knyttet til en tabel hvor ID er nøglen).

Jeg har nu sorteret listen ud fra id, og dette ser nogenlunde således ud:

1 Per
1 Ole
1 Anna
2 John
2 Chales
3 Gustav

Mit spørgsmål lyder nu:
Jeg vil gerne sortere den del af listen, der har ID: 2, ud fra tekst, men lade resten af listen stå uberørt. Derfor skulle listen efter sortering gerne se således ud:

1 Per
1 Ole
1 Anna
2 Chales
2 John
3 Gustav

Hvordan gøres dette?
p.s. Jeg ved godt hvor i listen jeg starter, og hvor jeg slutter. iStart = 3, iSlut = 4
Avatar billede jpk Nybegynder
18. oktober 2002 - 09:35 #1
Er det vigtigt, at resten af teksterne ikke også sorteres..?
Avatar billede mrfux Nybegynder
18. oktober 2002 - 09:40 #2
Resten af teksten må faktisk helst ikke sorteres, men det vigtigste er, at ID er i samme rækkefølge som vist på ovenstående.
Avatar billede jpk Nybegynder
18. oktober 2002 - 09:51 #3
Hvis du laver din SQL-sætning som ... ORDER BY ID,Tekst ... sorteres der primært efter Id, dernæst efter Tekst.
Avatar billede jpk Nybegynder
18. oktober 2002 - 09:52 #4
Du får altså:

1 Anna
1 Ole
1 Per
2 Chales
2 John
3 Gustav
Avatar billede mrfux Nybegynder
18. oktober 2002 - 10:11 #5
Øh - det skal gøres i C/C++, ikke i SQL. Så glem alt om DB - det er en liste/array.
Avatar billede jpk Nybegynder
18. oktober 2002 - 10:16 #6
Overskrift "Sortering af en del af en liste(database)"...
Avatar billede mrfux Nybegynder
18. oktober 2002 - 10:21 #7
Ja - men hvis du programmere til palm, er det muligt at lave databaser. Derfor.
Avatar billede mrfux Nybegynder
18. oktober 2002 - 10:21 #8
Men bare se på det som et array.
Avatar billede jpk Nybegynder
18. oktober 2002 - 10:28 #9
Jamen det er jo ikke tilstrækkelig oplysninger..!

For at sortere noget skal man jo vide hvad type det er!
Altså, hvordan er dine objekter defineret?
Fx:

struct Person
{
  int nID;
  string strName;
};

eller..?
Avatar billede jpk Nybegynder
18. oktober 2002 - 10:30 #10
Og hvilken datastruktur ligger de i?
Er det et egentligt array som fx:

Person* pPersoner = new Person[nNumElements];
Avatar billede mrfux Nybegynder
18. oktober 2002 - 10:38 #11
int ID
string name

og korrekt med arrayet. En normal quicksort til et standard array fungere nemlig OK.
Avatar billede mrfux Nybegynder
18. oktober 2002 - 10:38 #12
Men jeg undskylder mine utilstrækkelige oplysninger, og min formulering.
Avatar billede jpk Nybegynder
18. oktober 2002 - 10:42 #13
Men er ID og name attributter i en klasse?
(Hvordan ser den ud?)

Har du overvejet at bruge en datastruktur som fx vector istedet for et simpelt array?
Avatar billede mrfux Nybegynder
18. oktober 2002 - 10:54 #14
Det jeg leder efter, er en funktion, der virker som standardfunktionen quicksort, men kun sortere den del af listen jeg tidligere har beskrevet. Sorteringskriteriet er her en streng, der kan sammenlignes (hvis værdierne er ens, returneres 0, ellers > eller < end 0).
Avatar billede jpk Nybegynder
18. oktober 2002 - 11:13 #15
Jep, og hvis du bruger en STL list til elementerne, er dette ret simpelt...
Avatar billede jpk Nybegynder
18. oktober 2002 - 13:26 #16
// Sortering.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

// Person
class Person
{
public:
    Person(int nID, string strName);
    Print();

    int m_nID;
    string m_strName;
};

Person::Person(int nID, string strName)
    : m_nID(nID), m_strName(strName)
{
}

Person::Print()
{
    cout << "ID: " << m_nID << "\t\tName: " << m_strName << endl;
}


bool id_compare(const Person& x, const Person& y)
{
    return x.m_nID < y.m_nID;
}

bool string_compare(const Person& x, const Person& y)
{
    return x.m_strName < y.m_strName ? 1 : 0;
}


// People
class People
{
public:
    People();
    void AddPerson(Person NewPerson);
    void Write();
    void SortID();
    void SortName(int nBeginIdx, int nEndIdx);

protected:
    vector<Person> m_PeopleList;
};

People::People()
{
}

void People::AddPerson(Person NewPerson)
{
    m_PeopleList.push_back(NewPerson);
}

void People::Write()
{
    vector<Person>::iterator it = m_PeopleList.begin();
    while(it != m_PeopleList.end())
    {
        (*it++).Print();
    }
}

void People::SortID()
{
    sort(m_PeopleList.begin(), m_PeopleList.end(), id_compare);
}

void People::SortName(int nBeginIdx, int nEndIdx)
{
    sort(&m_PeopleList[nBeginIdx], &m_PeopleList[nEndIdx+1], string_compare);
}

int main(int argc, char* argv[])
{
    People ThePeople;

    ThePeople.AddPerson(Person(1, "Per"));
    ThePeople.AddPerson(Person(2, "John"));
    ThePeople.AddPerson(Person(1, "Anna"));
    ThePeople.AddPerson(Person(2, "Charles"));
    ThePeople.AddPerson(Person(3, "Gustav"));
    ThePeople.AddPerson(Person(1, "Ole"));

    ThePeople.Write();

    ThePeople.SortID();
    cout << "\nSort by ID" << endl;
    ThePeople.Write();

    ThePeople.SortName(3, 4);
    cout << "\nSort by Name" << endl;
    ThePeople.Write();


    return 0;
}
Avatar billede jpk Nybegynder
18. oktober 2002 - 13:26 #17
Du skal fjerne #include "stdafx.h" hvis du ikke bruger VC++
Avatar billede jpk Nybegynder
21. oktober 2002 - 08:46 #18
Hvad med at give en begrundelse..!

Mit ovenstående svar er jo faktisk en fungerende løsning på det problem du har beskrevet her!
Avatar billede segmose Nybegynder
21. oktober 2002 - 12:58 #19
Brug qsort med følgende compare funktion:

int compare(rec *a, rec *b) {
  // a < b
  if (a->id < b->id || (a->id == b->id && strcmp(a->navn, b->navn)<0)
    return -1;
  // a > b
  if (a->id > b->id || strcmp(a.navn, b.navn)>0)
    return 1;
  // equal
  return 0;
}
Indsæt selv korrekte type.
Avatar billede mrfux Nybegynder
22. oktober 2002 - 11:53 #20
jpk: Undskyld udeladt begrundelse, men det spiller altså ikke...
Avatar billede mrfux Nybegynder
22. oktober 2002 - 11:54 #21
Men jeg mangler stadig at bytte om på en del af listen - uden at røre ved den resterende del af listen....
Sortering med strcmp kender jeg "desværre" godt til.
Avatar billede jpk Nybegynder
22. oktober 2002 - 12:14 #22
Jamen det løser mit eksempel jo...
Koden:
ThePeople.SortName(3, 4);
sorterer listen fra nummer 3 til 4 efter navn, uden at røre resten af listen!
Avatar billede segmose Nybegynder
22. oktober 2002 - 16:56 #23
Ved kreativ brug a qsort, peg på første element af det der skal
sorteres altså din Id=2 og antal poster der skal sorteres.

Hvis du bruger den angivne compare på hele listen skulle du få
samme resultat, primær nøgle er Id, sekundær er navn, så vil
du få recordne sorteret efter Id og indenfor hver Id efter navn.
Avatar billede jpk Nybegynder
23. oktober 2002 - 08:47 #24
mrfux >> Har du prøvet at køre mit eksempel..?
Avatar billede mrfux Nybegynder
23. oktober 2002 - 16:39 #25
jpk, du får halvdelen af pointene for det store engagement. Men det virker altså ikke... (send et svar)
segmose, du får den anden halvdel, fordi du inspirrerede mig til en løsning. Det er nødvendigt med et rekursivt kald for at sortere databasen som jeg vil have det.
Avatar billede jpk Nybegynder
23. oktober 2002 - 16:44 #26
1) Jeg har selv testet den løsning jeg har lavet og den virker fint.
(Du må endelig gerne kommentere hvad det er der ikke virker hos dig...)

2) Det er ikke nødvendigt med et rekursivt kald.
Avatar billede jpk Nybegynder
05. december 2002 - 12:20 #27
Tak...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester