Hvordan sortere tabeller?

Hvordan sortere tabeller?

Innleggav 1337 » fre 01.04.2011 12:55

Jeg har et lite problem med koden under.
Metoden: public static void sorterVedUtvlag(String[] flyplasser, int[] antallAvganger) {
skal sortere avganger sammen med flyplasser kronologisk. Største tall først problemet er at bare tallene blir sortert, ikke flyplassene som "tilhører" tallene.

Det beste er å illustrere dette på er eksempel på en kjøring,slik kjøres programmet no:
Flyplasser sortert etter antall avganger.
Kode: Merk alt
 Flyplass : Antall avganger
 Stockholm (ARL) : 12
      Oslo (OSL) :  8
København (CPH) :  6
     Praha (PRG) :  5
 Stavanger (SVG) :  4
 Barcelona (BCN) :  3
Paris-Orly (ORY) :  2
      Wien (VIE) :  2
     Bodø (BDO) :  1
Dusseldorf (DUS) :  1



og slik ønsker jeg det skal kjøres:
Kode: Merk alt
Flyplasser sortert etter antall avganger.
        Flyplass : Antall avganger
      Oslo (OSL) : 12
København (CPH) :  8
Stockholm (ARL) :  6
Stavanger (SVG) :  5
      Bodø (BDO) :  4
Dusseldorf (DUS) :  3
Paris-Orly (ORY) :  2
     Praha (PRG) :  2
      Wien (VIE) :  1
Barcelona (BCN) :  1




Kildekoden til programmet:

Kode: Merk alt
class Sorterprogram {
  /** Skriv ut flyplasser med assosiert antall avganger.
    * @param flyplasser tabell med flyplasser
    * @param antallAvganger assosiert tabell med antall avganger hver dag */
  public static void skrivUt(String[] flyplasser, int[] antallAvganger) {
    assert (flyplasser.length == antallAvganger.length) : "Tabeller ikke assosiert.";
    System.out.println("        Flyplass : Antall avganger");
    for (int i = 0; i < flyplasser.length; ++i) {
      System.out.printf("%16s : %2d%n", flyplasser[i], antallAvganger[i]);
    }
    System.out.println();
  }
 
  /** sorter tabeller flyplasser og antallAvganger etter antall avganger fra en flyplass.
    * @param flyplasser tabell med flyplasser
    * @param antallAvganger assosiert tabell med antall avganger hver dag */
  public static void sorterVedUtvlag(String[] flyplasser, int[] antallAvganger) {
       // For hvert gjennomløp:
       for (int ind = 0; ind < antallAvganger.length - 1; ind++) {
         // Finn minste-verdi i usortert del av tabellen
         int indTilMinste = ind;
         for (int k = ind + 1; k < antallAvganger.length; k++) {
           if (antallAvganger[k] > antallAvganger[indTilMinste]) {
             indTilMinste = k ;
           }
         }
         // Bytt om minste-verdi og første element i usortert del
         int temp = antallAvganger[ind];
         antallAvganger[ind] = antallAvganger[indTilMinste];
         antallAvganger[indTilMinste] = temp;
       }
     }
 
 
  public static void main(String[] args){
    // flyplasser
    String[] flyplasser = {
      "Stockholm (ARL)", "Oslo (OSL)", "København (CPH)",
      "Praha (PRG)", "Stavanger (SVG)", "Barcelona (BCN)",
      "Paris-Orly (ORY)", "Wien (VIE)", "Bodø (BDO)",
      "Dusseldorf (DUS)" };
   
    // assosiert tabell med antall avganger per dag
    int[] antallAvganger = {
      6, 12, 8,
      2, 5, 1,
      2, 1, 4, 3 };
    System.out.println("Flyplasser usortert.");
    skrivUt(flyplasser, antallAvganger);
   
    System.out.println("Flyplasser sortert etter antall avganger.");
    sorterVedUtvlag(flyplasser, antallAvganger);
    skrivUt(flyplasser, antallAvganger); 
  }
}
medlem i 144 måneder
 

Re: Hvordan sortere tabeller?

Innleggav Soerboe » søn 03.04.2011 20:09

Gjør du noe med arrayen flyplasser i koden din? Hvis ikke så kan du ikke forvente at den skal bli sortert.

TIPS: 3 linjer til fikser biffen, og likheten med ombyttinga av antallAvganger er slående...

Hvis dette ble for vagt, si ifra :-)

Brukerens avatar
medlem i 184 måneder
 

Re: Hvordan sortere tabeller?

Innleggav 1337 » man 04.04.2011 12:54

Takker for tilbakemeldingen.
Det ble kanskje litt vagt, jeg prøvde uansett å bruke samme koden som sorterte antallAvganger, uten at det ble noe hell, her er kildekoden:
Kode: Merk alt
 
class Sorterprogram {
  /** Skriv ut flyplasser med assosiert antall avganger.
    * @param flyplasser tabell med flyplasser
    * @param antallAvganger assosiert tabell med antall avganger hver dag */
  public static void skrivUt(String[] flyplasser, int[] antallAvganger) {
    assert (flyplasser.length == antallAvganger.length) : "Tabeller ikke assosiert.";
    System.out.println("        Flyplass : Antall avganger");
    for (int i = 0; i < flyplasser.length; ++i) {
      System.out.printf("%16s : %2d%n", flyplasser[i], antallAvganger[i]);
    }
    System.out.println();
  }
 
  /** sorter tabeller flyplasser og antallAvganger etter antall avganger fra en flyplass.
    * @param flyplasser tabell med flyplasser
    * @param antallAvganger assosiert tabell med antall avganger hver dag */
  public static void sorterVedUtvlag(String[] flyplasser, int[] antallAvganger) {
       // For hvert gjennomløp:
       for (int ind = 0; ind < antallAvganger.length - 1; ind++) {
         // Finn minste-verdi i usortert del av tabellen
         int indTilMinste = ind;
         for (int k = ind + 1; k < antallAvganger.length; k++) {
           if (antallAvganger[k] > antallAvganger[indTilMinste]) {
             indTilMinste = k ;
           }
         }
         // Bytt om minste-verdi og første element i usortert del
         int avgang = antallAvganger[ind];
         antallAvganger[ind] = antallAvganger[indTilMinste];
         antallAvganger[indTilMinste] = avgang;
       }
      
       for (int ind = 0; ind < flyplasser.length - 1; ind ++) {
          int indTilMinste = ind;
          for (int k = ind + 1; k < flyplasser.length; k++) {
             if (flyplasser[k].compareTo(flyplasser[indTilMinste]) < 0) {
                indTilMinste = k;
   
             
   
             }
          }
          String flyplass = flyplasser [ind];
          flyplasser [ind] = flyplasser [indTilMinste];
          flyplasser [indTilMinste] = flyplass;
          
       }
     }
 
 
  public static void main(String[] args){
    // flyplasser
    String[] flyplasser = {
      "Stockholm (ARL)", "Oslo (OSL)", "København (CPH)",
      "Praha (PRG)", "Stavanger (SVG)", "Barcelona (BCN)",
      "Paris-Orly (ORY)", "Wien (VIE)", "Bodø (BDO)",
      "Dusseldorf (DUS)" };
   
    // assosiert tabell med antall avganger per dag
    int[] antallAvganger = {
      6, 12, 8,
      2, 5, 1,
      2, 1, 4, 3 };
    System.out.println("Flyplasser usortert.");
    skrivUt(flyplasser, antallAvganger);
   
    System.out.println("Flyplasser sortert etter antall avganger.");
    sorterVedUtvlag(flyplasser, antallAvganger);
    skrivUt(flyplasser, antallAvganger); 
  }
}



Hva er gale?
medlem i 144 måneder
 

Re: Hvordan sortere tabeller?

Innleggav Soerboe » man 04.04.2011 13:07

Har jeg forstått det riktig at elementene i flyplass og avgang tabellen korresponderer? F.eks. hvis element 1 i flyplasstabellen er Oslo og element 1 i avgangtabellen er 8, så betyr det 8 avganger fra Oslo? Noe annet virker egentlig lite logisk...

I så fall må du endre begge tabellene når du endrer den ene. Siden du sorterer på avganger må du også endre flyplasstabellen (samtidig). Som sagt er 3 linjer kode nok. Og du er inne på det med endringen du gjør, men du bør vel helst bytte om på samme elementer i begge tabellene for at det skal bli riktig.

Brukerens avatar
medlem i 184 måneder
 

Re: Hvordan sortere tabeller?

Innleggav dundee » man 04.04.2011 13:12

Anbefaler deg å kikke på muligheten til å bruke Collections i stedet for arrays. F.eks kan du bruke varianter av Map hvor du knytter flyplass og antall avganger sammen. Du får også langt bedre muligheter til å sortere ved bruk av set eller list.
medlem i 157 måneder
 

Re: Hvordan sortere tabeller?

Innleggav Soerboe » man 04.04.2011 13:15

dundee skrev:Anbefaler deg å kikke på muligheten til å bruke Collections i stedet for arrays. F.eks kan du bruke varianter av Map hvor du knytter flyplass og antall avganger sammen. Du får også langt bedre muligheter til å sortere ved bruk av set eller list.


nå er vel heller hensikten å lære seg programmering (og gjøre sin lekse) enn å bruke ferdige pakker som man ikke lærer en døyt av å bruke.

Brukerens avatar
medlem i 184 måneder
 


Returner til Java



Hvem er i Forumene

Registrerte brukere: Google [Bot]