Avatar billede kivig Nybegynder
21. december 2005 - 22:56 Der er 50 kommentarer og
1 løsning

problem med selection sort algoritmen

Hejsa.

Jeg er ved at lave en opgave som går ud på at vise selection og insertion sort algoritmerne. Jeg er gået i stå med en fejlmeddelelse som siger: illegal start of expression ved linien.
"if (list[scan].compareTo(list[min]) < 0)"

jeg har sat en markering nedenfor.

Har i nogle forslag?
.........................................
import java.util.Random;
public class Sort
{

// Generates random numbers between 0 and 50.
     
  public static void main (String[] args)
  {
      Random generator = new Random();
      int num1;
     
      num1 = generator.nextInt(50) + 1; 

// creating an array

      int[] list = new int[50];

// Load the array with values
      for (int index=0; index < list.length; index++)
                  list[index] = generator.nextInt(50) + 1;
    }

//  Sorts the array using the selection sort algorithm.

  public static void selectionSort (int[] list)
  {
      int min;
      int temp;     

      for (int index = 0; index < list.length-1; index++)
      {
        min = index;
        for (int scan = index+1; scan < list.length; scan++)
--------> if (list[scan].compareTo(list[min]) < 0)
              min = scan;

        // Swap the values
        temp = list[min];
        list[min] = list[index];
        list[index] = temp;
      }
 
}
  //-----------------------------------------------------------------
  //  Sorts the array using the insertion
  //  sort algorithm.
  //-----------------------------------------------------------------
 
  {
      for (int index = 1; index < list.length; index++)
    {
      int tal = list[index];
      int position = index;

      while (position > 0 && tal[position-1] > tal)
      {
          list[position] = list[position-1];
          position--;
      }
       
      list[position] = tal;
    }
  }
}
Avatar billede erikjacobsen Ekspert
21. december 2005 - 23:06 #1
Hvis det er ints du sammenligner skal du bare bruge < direkte:

if (list[scan]<list[min])
Avatar billede erikjacobsen Ekspert
21. december 2005 - 23:10 #2
Og så skal du huske at kalde selectionSort, og udskrive resultatet, og fjerne eller udkommentere kodestumpen forneden der har med insertionsort at gøre. Så skulle det vist virke.
Avatar billede kivig Nybegynder
21. december 2005 - 23:27 #3
forsøger stadig.. fejlmedd. er væk men nu kan jeg ikke kalde selectionSort.. er det fordi den er sat til: VOID selectionSort (int[] list) ?
Avatar billede erikjacobsen Ekspert
21. december 2005 - 23:28 #4
Jeg kan godt ;)
Avatar billede kivig Nybegynder
21. december 2005 - 23:30 #5
Hmm.. så må jeg vist liiige tage mig sammen :)
Avatar billede erikjacobsen Ekspert
21. december 2005 - 23:32 #6
;) - eller vise os hvad du prøver...
Avatar billede kivig Nybegynder
21. december 2005 - 23:40 #7
Jeg prøver alt muligt forskelligt, da jeg ikke er helt sikker på hvad og hvordan jeg kalder selectionSort. Jeg får forskellige fejl.. bla. at den ikke kan returnere en void (hvilket jeg godt kan forstå).. men men men.. jeg kan ikke lure om jeg skal bruge list, index eller temp for at hente den sorterede liste. ? :)
Avatar billede erikjacobsen Ekspert
21. december 2005 - 23:42 #8
Jamen det du har vist er stort set korrekt. Vis koden hvor du prøver at kalde selectionSort.
(Jeg giver aldrig/sjældent løsningen til en "skoleopgave", men gerne hjælp til selvhjælp...)
Avatar billede kivig Nybegynder
21. december 2005 - 23:44 #9
Super det er også sådan det skal være.. så ka jeg lære det ;)

public static void selectionSort (int[] list)
  {
      int min;
      int temp;     

      for (int index = 0; index < list.length-1; index++)
      {
        min = index;
        for (int scan = index+1; scan < list.length; scan++)
        if (list[scan]<list[min])
              min = scan;

        // Swap the values
        temp = list[min];
        list[min] = list[index];
        list[index] = temp;
       
        int sorted = temp;
        System.out.println ("\nThe Average is " +sorted);
      }
 
}
Avatar billede erikjacobsen Ekspert
21. december 2005 - 23:46 #10
Du skal ikke ændre i selectionSort metoden. Den er god nok, og ikke omfattet af de 3 punkter jeg skrev 23:10:50
Avatar billede kivig Nybegynder
21. december 2005 - 23:49 #11
hovsa, ignorer lige teksten i println. "The average is.."

men når jeg prøver at teste kan jeg både køre en "void main string arg" og en " void selectionSort (int[] list).. den sidste har intet indhold i arrayen og den første har intet output. ?
Avatar billede erikjacobsen Ekspert
21. december 2005 - 23:50 #12
Det er derfor du skal kalde metoden selectionSort.
Avatar billede kivig Nybegynder
22. december 2005 - 00:03 #13
ok.. vil det være en god idé at lave en ny main og kalde selectionSort derfra og ikke som nu kalde i class sort ?
Avatar billede erikjacobsen Ekspert
22. december 2005 - 00:07 #14
Lige nu og her har du en main-metode. Det er den eneste der udføres. I den kan du kalde andre metoder. Vent lidt med at opdele i flere klasser.

Er der noget du er i tvivl om i forhold til det jeg skrev 23:10:50 ?
Avatar billede kivig Nybegynder
22. december 2005 - 00:16 #15
Det eneste problem jeg har nu er at kalde selectionSort og udskrive resultatet. Men kan jeg kalde selectionsort i toppen af main selvom at sorteringen først udføres i bunden? det mener jeg jo ikke man kan rent logisk, så derfor burde jeg skulle kalde i bunden af klassen sort. ?
Avatar billede erikjacobsen Ekspert
22. december 2005 - 00:18 #16
Du skal først kalde selectionSort, når du har puttet noget i dit array. Men ja, du kan bare gøre det i main. Og du kan genbruge noget af for-løkken du allerede har til en udskrift - også i main.
Avatar billede kivig Nybegynder
22. december 2005 - 00:43 #17
OK.. nu er der hul igennem til min array, og har testet det med en println. Mit STORE problem er stadig hvordan jeg kalder selectionSort.. Jeg mener.. der er en hel del variabler jeg kan vælge imellem. Men den variabel jeg mener at indeholde den sorterede array er enten Temp eller list[index].

public static void selectionSort (int[] list)
  {
      int min;
      int temp;     

      for (int index = 0; index < list.length-1; index++)
      {
        min = index;
        for (int scan = index+1; scan < list.length; scan++)
        if (list[scan]<list[min])
              min = scan;

        // Swap the values
        temp = list[min];
        list[min] = list[index];
        list[index] = temp;
       
      }
 

  }
Avatar billede erikjacobsen Ekspert
22. december 2005 - 00:50 #18
Det er "list" der indeholder dit sorterede array.
Avatar billede kivig Nybegynder
22. december 2005 - 01:44 #19
jeg må kapitulere. Jeg kan simpelthen ikke fatte hvordan jeg skal kunne hente "list" fra selectionSort når den ikke returnere noget - (void). hvordan man evt skulle gøre det er jeg heller ikke sikker på. skal jeg bruge "get" eller skal jeg lave et objekt af selectionSort?
Avatar billede arne_v Ekspert
22. december 2005 - 01:51 #20
den returnerer ikke noget men den ændrer jo på arrayets indhold
Avatar billede kivig Nybegynder
22. december 2005 - 02:10 #21
Jeg vil kæmpe videre i morgen. :) mange tak for din vedholdenhed og tålmodighed. Det skal nok komme en dag, bare ikke i dag.

Lige en lille ting.. Når jeg prøver at printe "list" får jeg beskeden:package system does not exist. Hvad betyder det?

:)
Avatar billede arne_v Ekspert
22. december 2005 - 02:12 #22
system med småt fremfor System måske ?
Avatar billede kivig Nybegynder
22. december 2005 - 02:15 #23
ja.. det hjalp.. men udprintet giver en lang liste med disse:
[I@5e538e
[I@5e538e
[I@5e538e
osv.

jeg går ud fra jeg ikke henter den rigtige liste.?
Avatar billede arne_v Ekspert
22. december 2005 - 02:18 #24
du kan ikke bare udskrive et array

du er nødt til at lave en løkke som udskriver arrayets elementer
Avatar billede kivig Nybegynder
22. december 2005 - 02:24 #25
arrayets elementer er disse ikke?

for (int index=0; index < list.length; index++)

Og derefter printer jeg denne løkke?

Eller er det for nemt :)
Avatar billede arne_v Ekspert
22. december 2005 - 02:26 #26
for (int index=0; index < list.length; index++) {
  System.out.println(list[index]);
}
Avatar billede kivig Nybegynder
22. december 2005 - 02:33 #27
nu printer den fint ud, men udprintet er ikke sorteret. dvs. at jeg ikke kalder selectionSort, men main metoden. Puha..
Avatar billede erikjacobsen Ekspert
22. december 2005 - 08:19 #28
Du skal kalde selectionSort før løkken med udskriften - lidt li'som du kalder println
Avatar billede kivig Nybegynder
22. december 2005 - 11:02 #29
Er det den rigtige vej?

// Prints the selection sort

      Sort s = new Sort(list);
      S.selectionSort(list);
     
      for (int index=0; index < list.length; index++)
     
      System.out.println(list[index]);
Avatar billede erikjacobsen Ekspert
22. december 2005 - 14:22 #30
Det er en statisk metode i samme klasse som main, så du skal ikke oprette et nyt objekt. Dette skulle være tilstrækkeligt:

    selectionSort(list);

Hvis der er tal i listen sku' de meget gerne komme ud sorterede.
Avatar billede kivig Nybegynder
22. december 2005 - 18:52 #31
Hej igen.

Ja nu virker selectionsSort udprintet (Sikke dog store problemer for en SÅ lille linie som : selectionSort(list);)

Straks er der andre drillerier. Jeg er nu i gang med at få insertionSort algoritmen til at fungere og kan ikke (lige som sidst) compile nedenstående kode pga ".compareTo"-linien.

//  Sorts the array using the insertion sort algorithm.
 
  public static void insertionSort (int[] list)
  {
      for (int index = 1; index < list.length; index++)
      {
      int key = list[index];
      int position = index;

      //  Shift larger values to the right
-------> while (position > 0 && key.compareTo(list[position-1]) < 0)
        {
            list[position] = list[position-1];
            position--;
        }
           
        list[position] = key;
        }
      }
    }

Jeg har prøvet at erstatte det med < ligesom sidst men det funger heller ikke?
Avatar billede erikjacobsen Ekspert
22. december 2005 - 19:05 #32
Hvis det er et array af int skal du bruge < 
Hvad er det du skriver, som ikke virker?
Avatar billede kivig Nybegynder
22. december 2005 - 19:06 #33
while (position > 0 && key < (list[position-1]) < 0)
Avatar billede erikjacobsen Ekspert
22. december 2005 - 21:12 #34
while (position > 0 && key < list[position-1])
Avatar billede kivig Nybegynder
22. december 2005 - 21:52 #35
Mange tak Erik.

Nu virker det perfekt, også med selectionsSort algoritmen. Jeg forstår dog ikke den ændring du fik lavet, udover at hele indholdet er i samme ( ).

Nu hvor du ikke samler på points lukker jeg denne LANGE tråd, men mon ikke der kommer et problem eller 2 meget snart! :-}

Bedste jule hilsner

Kivig.
Avatar billede erikjacobsen Ekspert
22. december 2005 - 23:18 #36
"Jeg forstår dog ikke den ændring du fik lavet,[...]"  Du kan jo bare spørge - jeg skal bare vide hvilken af de ting jeg har skrevet, du mener.
Avatar billede kivig Nybegynder
22. december 2005 - 23:32 #37
Jeg forstår ikke hvorfor at

while (position > 0 && key < (list[position-1]) < 0)

bliver til

while (position > 0 && key < list[position-1])

Den første linie hvor < er erstattet med key.compareTo er taget fra min lærerbog, som jo burde være rigtig :/

Men hvorfor bliver parenteserne ophævet og < 0 forsvinder?
Avatar billede erikjacobsen Ekspert
22. december 2005 - 23:43 #38
Parentesen må gerne være der, men er overflødig:

  while (position > 0 && key < (list[position-1]) )

Man sammenligner simple værdier med <, fx int, double, char  (og også med >, >=, <=, ==, != )
Man sammenligner objekter med compareTo, fx. String  (og også med equals metoden)
Avatar billede kivig Nybegynder
22. december 2005 - 23:52 #39
ahh.ok.. ja selvfølgelig.. tal med matematiske udtryk og objekter med metodiske udtryk.
Avatar billede kivig Nybegynder
23. december 2005 - 00:18 #40
i hele denne øvelse har jeg kørt main metoden i selve klassen, men hvordan kan jeg skrive en driver class og kalde sorteringen derfra?
Avatar billede erikjacobsen Ekspert
23. december 2005 - 00:22 #41
Du skal have en klasse med en main-metode. Du kan lægge sorterings-metoden/metoderne i en eller flere andre klasser. Her kan du have dem enten som static eller ikke static metoder. Jeg forstår ikke helt hvad du spørger om.
Avatar billede kivig Nybegynder
23. december 2005 - 00:35 #42
hvordan kan man i en main metode kalde resultatet fra andre klasser så de vises i en println. ?

Det er sikkert ret simpelt lige som "selectionSort(list);", men jeg kan ikke helt gennemskue det i det kaotiske kode-virvar som en nybegynder-programmørs hjerne må affinde sig med.
Avatar billede erikjacobsen Ekspert
23. december 2005 - 08:38 #43
Hvis det er en statisk metode, så skriver du bare klassenavnet foran

    EnKlasse.enStatiskMetode();

Hvis det er en ikke-statisk metode, skal du oprette et objekt af klassen:

    EnKlasse enKlasse = new EnKlasse();
    enKlasse.metode();
Avatar billede kivig Nybegynder
23. december 2005 - 11:15 #44
OK.. Jeg har følgende:

En "public class searching"
hvori der er en
"public static Comparable LinearSearch(Comparable[] list, Comparable target)"
og en
"public static void selectionSort (int[] list)"
og en
"public static Comparable BinarySearch (Comparable[] list, Comparable target)"

Nu vil jeg gerne kalde søgningerne fra en driver klasses main metode.

Da alle metoderne er statiske, bruger jeg dit eksempel oven over.
EnKlasse.enStatiskMetode();

dvs. searching.enStatiskMetode(); ? jeg har problemer med "Comparable LinearSearch" da comparable er en java.lang.
Avatar billede erikjacobsen Ekspert
23. december 2005 - 16:56 #45
"jeg har problemer" - hvilke problemer?
Avatar billede kivig Nybegynder
23. december 2005 - 17:07 #46
er det "Comparable LinearSearch", "Comparable" eller "LinearSearch" der er metoden ?
Avatar billede kivig Nybegynder
23. december 2005 - 17:59 #47
"public static Comparable LinearSearch(Comparable[] list, Comparable target)"

Jeg har skrevet:

System.out.println("This is the search with a LinearSearch. \n");
      LinearSearch (target);

Men får fejl pga "target" det samme sker med "list" og "ingenting".
Avatar billede erikjacobsen Ekspert
23. december 2005 - 18:10 #48
LinearSearch som du har defineret den, tager 2 argumenter: en liste af dimser, og en dims (som nok er den der skal søges efter). I eksemplet du viser kalder du den med 1 argument.

Men prøv at fortælle hvad din fejl er. Det hjælper dyt at skrive: "Men får fejl" - Hvilken fejl?
Avatar billede kivig Nybegynder
23. december 2005 - 18:14 #49
Fejlen ved target er:

Cannot resolve symbol - variable target
Avatar billede erikjacobsen Ekspert
23. december 2005 - 22:25 #50
Så har du ikke en variabel med navn target, der hvor du kalder LinearSearch.
(og så plejer man at navngive metoder i java med lille begyndelsesbogstav: linearSearch, og
klasse med stort: public class Searching - men det er selvfølgelig ikke derfor det ikke virker)
Avatar billede kivig Nybegynder
24. december 2005 - 13:01 #51
:) mange tak for din vedholdenhed. Du har virkelig været til stor hjælp.

Jeg roder videre med koden i juledagene.

Rigtig glædelig jul.

Kivig
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