Avatar billede phliplip Nybegynder
04. juli 2006 - 12:28 Der er 4 kommentarer og
1 løsning

Rutine til at sortere et multidim-array

Hej Experter!

Har et multidimensionelt array med producenter vandret og produkter horizontalt.

Og felterne indeholder priser.

Jeg søger en rutine til at sortere array'et så den billigste pris ligger øverst mod venstre.

Hvis der ikke er nogen pris eller pris lig 0 så skal de nederst.

Jeg har prøvet at visualisere det her:
http://www.bipbip.dk/grid.htm

Jeg har rutiner så jeg kan sortere enkelte kolloner og rækker.

God sommer derude ;)

Mvh. Philip
Avatar billede jakoba Nybegynder
05. juli 2006 - 11:17 #1
Såvidt jeg kan se ønsker du at både søjler og rækker skal ende med at indeholde de samme værdier som i starten, blot i en evt anden rækkefølge (ordnet).

og det giver ikke rigtig mening.

se fx rækkerne for prod2 og prod3. prod3's name2 er hundedyr, men da prod2 har det billigste produkt (name2 for kun 8) kommer name2 prisen til at stå foran den billigere name1 i prod3's række (omvendt orden).

Det kan så være ok, men vi har et værre problem in prod1's name4. Hvis vi havde valgt den som 'den billigste' (både den og prod2's name2 koster 8) ville vi have fået et totalt anderledes (og ligeså 'korrekt') skema. De ordnede data hæmmer snarere end fremmer muligheden for at sammenligne priser og producenter.

Så jeg gætter på at du ikke rigtig har tænkt igennem hvad det egentlig er du vil have ud af denne sortering. Indtil du ved det er det spild at begynde at skrive kode.
Avatar billede phliplip Nybegynder
05. juli 2006 - 12:30 #2
Hej Jakob,

Ja, rækker og søjler skal ende med at indeholde samme data som fra starten, rækkefølgen de ligger i er ligegyldig.

Jeg er klar over at resten af prod1 priser kan være dyrere.. Det jeg vil er at finde den absolut billigste pris, og lægge den i første række og første søjle. At de andre måske er dyrere, så er det i dette tilfælde ligegyldigt. Hvis der er en der har samme pris, så er det ligegyldigt om det er den eller den anden, produktet er det samme.
Avatar billede jakoba Nybegynder
05. juli 2006 - 16:12 #3
OK.

Her er så en pseudokode

1) find absolut billigste pris i dit array2D

  prodFound = "";
  nameFound = "";
  prisfound = MaxInteger;      // et meget stort tal.
  foreach ( array2D as prod, nameArray ) {
      foreach ( nameArray as name, pris ) {
          if ( pris != 0  &&  pris < prisFound ) {
              prodFound = prod;
              nameFound = name;
              prisFound = pris;
          }
      }
  }
  if( prodFound == "" ) {
      //stop eksekvering der er ingen pris værdier i array2D
  }

2) sorter prod dimensionen efter nameFound colonnes værdier. nedenfor er det en simpel selection sort da der næppe er et ovevættes stort antal prod'er

  prodKeyMAX = array2D.length;
  String[] prodKeys = new String[array2D.length];
  i = 0;
  foreach ( array2D as prod, nameArray ) {
      prodKeys[i++] = prod;
  }
  nameKeyMAX = array2D[prodKeys[0]].length;
  String[] nameKeys = new String[array2D[prodKeys[0]].length];
  i = 0;
  foreach ( array2D[prodKeys[0]] as name, pris ) {
      nameKeys[i++] = name;
  }
  // via de 2 arrays kan vi nu adressere ind i array2D med tal.

  // vi ønsker at sortere efter kolonnen nameFound
  nameIndex = -1;
  for( n=0; n<nameKeyMAX; n++ ) {
      if nameKeys[n] == nameFound {
          nameIndex = n;
          break;
      }
    }

  for( p1=0; p1<prodKeyMAX; p1++ ) {                    // først sorteres rækker
      p1pris = array2D[prodKeys[p1]][nameFound];
      for( p2=p1+1; p2<prodKeyMAX; p2++ ) {
          p2pris = array2D[prodKeys[p2]][nameFound];
          if(    p2pris != 0
                &&  ( p1pris == 0 || p1pris > p2pris )
              ) {
              temp = prodKeys[p1];
              prodKeys[p1] = prodKeys[p2];
              prodKeys[p2] = temp;
              p1pris = p2pris;            // p1pris er altid den laveste fundet hidtil
          }
      }         
  }
  // bemærk at der overhovedet ikke flyttes rundt på data i array2D.
  // det er kun indexArrayet prodKeys der ændres i.

  int[] nameArray = array2D[prodKeys[0]];             
  for( n1=0; n1<nameKeyMAX; n1++ ) {                    // så sorteres kolonner
      n1pris = nameArray[nameKeys[n1]];
      for( n2=n1+1; n2<nameKeyMAX; n2++ ) {
          n2pris = nameArray[nameKeys[n2]];
          if(    n2pris != 0
                &&  ( n1pris == 0 || n1pris > n2pris )
              ) {
              temp = nameKeys[n1];
              nameKeys[n1] = nameKeys[n2];
              nameKeys[n2] = temp;
              n1pris = n2pris;            // n1pris er altid den laveste fundet hidtil
          }
      }         
  }
  // igen vi flytter ikke noget i array2D's mange rækker, vi ændrer blot indearrayet nameKeys
  // så Array2D[...][nameKeys[0]] er den ønskede første kolonne.

3) Så er der sorteret. udskriv værdierene med:

  for( p=0; p<prodKeyMAX; p++ ) {        // det skal utvivlsomt smukkes op :-)
      for( n=0; n<nameKeyMAX; n++ ) {
          udskriv( array2D[prodKeys[p]][nameKeys[n]] );
      }
      udskriv( linieskift );
  }

mvh JakobA
Avatar billede phliplip Nybegynder
09. juli 2006 - 13:08 #4
Hej Jakob!

Jeg er lige taget på ferie i 4 uger, så får ikke tid til at kigge på det før jeg kommer hjem. Men smid et svar så får du points alligevel.
Avatar billede jakoba Nybegynder
10. juli 2006 - 14:40 #5
kay :)
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