Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 18:23 Der er 116 kommentarer og
2 løsninger

Array og sortering

Jeg vil lave et program som skal kunne sortere et array af heltal. Det skal kunne kaldes med et array, der indeholder fra 0
til n heltal, hvis orden ikke er kendt. Jeg har derudover planer om at det skal være muligt at sortere arrayet i enten stigende
eller faldende orden.
Jeg har bikset lidt rundt med det, men er gået kold. Pointsne tilfalder den der kan skrive mig koden på ovenstående.

Håber du/I kan hjælpe, snarest.

På forhånd tak.
Avatar billede arne_v Ekspert
31. oktober 2004 - 18:25 #1
Hvorfor kan du ikke bare bruge:

Arrays.sort(ditarray);

?
Avatar billede arne_v Ekspert
31. oktober 2004 - 18:27 #2
Hvis du absolut vil gøre det selv:

  private static void qsint_help(int n1, int n2, int[] ia) {
      int tmp;
      int l = n1;
      int r = n2;
      int pivot = ia[(n1 + n2) / 2];
      do {
        while (ia[l] < pivot)
            l++;
        while (ia[r] > pivot)
            r--;
        if (l <= r) {
            tmp = ia[l];
            ia[l] = ia[r];
            ia[r] = tmp;
            l++;
            r--;
        }
      }
      while (l <= r);
      if (n1 < r)
        qsint_help(n1, r, ia);
      if (l < n2)
        qsint_help(l, n2, ia);
      return;
  }
  public static void qsint(int[] ia) {
      qsint_help(0, ia.length - 1, ia);
      return;
  }
Avatar billede arne_v Ekspert
31. oktober 2004 - 18:28 #3
så vil:

qsint(ditarray);

sortere.
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 18:30 #4
Hej Arne. Du er hurtig. Jeg er helt nybegynder på feltet. Har du mulighed for at skrive koden så simpel som overhovedet muligt? Altså hele klassen.
Avatar billede arne_v Ekspert
31. oktober 2004 - 18:31 #5
2 minutter
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:33 #6
int[] liste = {2,5,8,1,6,19,62,442,12,56}

      for (int index = 1; index < liste.length; index++)
      {
        int key = liste[index];
        int position = index;

       
        while (position > 0 && liste[position-1] > key)
        {
          liste[position] = liste[position-1];
            position--;
        }
           
        liste[position] = key;
      }

er det noget lignende det du søger?
Avatar billede arne_v Ekspert
31. oktober 2004 - 18:33 #7
import java.util.*;

public class Sorting {
    private static void qsint_help(int n1, int n2, int[] ia) {
        int tmp;
        int l = n1;
        int r = n2;
        int pivot = ia[(n1 + n2) / 2];
        do {
            while (ia[l] < pivot)
                l++;
            while (ia[r] > pivot)
                r--;
            if (l <= r) {
                tmp = ia[l];
                ia[l] = ia[r];
                ia[r] = tmp;
                l++;
                r--;
            }
        } while (l <= r);
        if (n1 < r)
            qsint_help(n1, r, ia);
        if (l < n2)
            qsint_help(l, n2, ia);
        return;
    }

    public static void qsint(int[] ia) {
        qsint_help(0, ia.length - 1, ia);
        return;
    }

    public static void main(String[] args) {
        int[] ia = { 4, 7, 6, 2, 9, 1, 3, 5, 8, 0 };
        int[] ia1 = (int[]) ia.clone();
        Arrays.sort(ia1);
        System.out.println("Indbygget");
        for (int i = 0; i < ia1.length; i++) {
            System.out.println(ia1[i]);
        }
        int[] ia2 = (int[]) ia.clone();
        qsint(ia2);
        System.out.println("Egen");
        for (int i = 0; i < ia2.length; i++) {
            System.out.println(ia2[i]);
        }
    }
}
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:35 #8
public class <navnet på din java fil>

public static void main(String[] args)

for (int index = 1; index < liste.length; index++)
      {
        int key = liste[index];
        int position = index;

       
        while (position > 0 && liste[position-1] > key)
        {
          liste[position] = liste[position-1];
            position--;
        }
           
        liste[position] = key;
      }
  }
for(int i = 0; i < liste.length; i++)
System.out.println(liste[i]);

  }
Avatar billede arne_v Ekspert
31. oktober 2004 - 18:36 #9
Og hvis du vil have sorteret omvendt (størst først), så

    private static void qsint_help(int n1, int n2, int[] ia) {
        int tmp;
        int l = n1;
        int r = n2;
        int pivot = ia[(n1 + n2) / 2];
        do {
            while (ia[l] > pivot) // <----- vendt om
                l++;
            while (ia[r] < pivot) // <----- vendt om
                r--;
            if (l <= r) {
                tmp = ia[l];
                ia[l] = ia[r];
                ia[r] = tmp;
                l++;
                r--;
            }
        } while (l <= r);
        if (n1 < r)
            qsint_help(n1, r, ia);
        if (l < n2)
            qsint_help(l, n2, ia);
        return;
    }
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:40 #10
public static void Sorter (int[] tal)
  {
      for (int index = 1; index < tal.length; index++)
      {
        int key = tal[index];
        int position = index;

       
        while (position > 0 && tal[position-1] > key)
        {
            tal[position] = tal[position-1];
            position--;
        }
           
        tal[position] = key;
      }
  }


en metode som sortere på en anden måde
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 18:44 #11
Fastpoint, jeg tror du er på sporet af noget jeg kan bruge. Når, jeg smider din kode ind i BlueJ kan den dog ikke resolve symbol - variable liste. Hvis du/I har mulighed for det kan det så skrives mere simpelt, så jeg har en chance for at forstå hvad det er der sker? Jeg vil gerne have koden helt ned på "jeg har lige åbnet en java-bog-niveau".
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:45 #12
jo kan jeg godt to sekunder: )
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:46 #13
ps. hvilken af mine koder ville du bruge? den første eller sidstE?
Avatar billede arne_v Ekspert
31. oktober 2004 - 18:46 #14
Kan det være mere simpelt end:

Arrays.sort(ditarray);

?
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:47 #15
public class <navnet på din java fil>

public static void main(String[] args)

int[] liste = {2,5,8,1,6,19,62,442,12,56} ;
for (int index = 1; index < liste.length; index++)
      {
        int key = liste[index];
        int position = index;

       
        while (position > 0 && liste[position-1] > key)
        {
          liste[position] = liste[position-1];
            position--;
        }
           
        liste[position] = key;
      }
  }
for(int i = 0; i < liste.length; i++)
System.out.println(liste[i]);

  }
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 18:48 #16
jeg tror det skal være den sidste, da tallet skal indsættes som en int. Nu du er i gang kan du så skrive den ind med fields, constructor osv;-)
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:48 #17
manglede at oprette array'et liste før.. sorry.. prøv lige koden i hvertfald
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:49 #18
okay så ordner jeg lige den anden;)
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:51 #19
public class Fields
{
public static void main(String[] args)
{
int[] liste = {2,5,8,1,6,19,62,442,12,56} ;
public static void Fields()
  {
      for (int index = 1; index < liste.length; index++)
      {
        int key = liste[index];
        int position = index;

       
        while (position > 0 && liste[position-1] > key)
        {
            liste[position] = liste[position-1];
            position--;
        }
           
        tal[position] = key;
      }
  }




}

}
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:52 #20
public class Fields
{
public static void main(String[] args)
{
int[] liste = {2,5,8,1,6,19,62,442,12,56} ;
public static void Fields()
  {
      for (int index = 1; index < liste.length; index++)
      {
        int key = liste[index];
        int position = index;

       
        while (position > 0 && liste[position-1] > key)
        {
            liste[position] = liste[position-1];
            position--;
        }
           
        liste[position] = key;
      }
  }




}

}
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:52 #21
sorry.. prøv den sidste... det gik lidt hurtigt og koder det her på eksperten.dk :p så test lige
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 18:55 #22
jeg fik koden compiled. Jeg er dog ikke helt med på hvad det er den gør. Det jeg havde forstillet mig var noget i stil med:

public class Program
{
    private ArrayList numbers;
   
    public Program()
    {
   
      numbers = new ArrayList();
     
    }

    public void addNumber(int number)
    {
        numbers.add(number);
    }
   
  }
         
Jeg kan dog ikke indsætte int i denne array. Derudover skal der selfølgelig kunne sorteres osv. Som du kan se, er det her helt ned på begynderniveau, men kan nogle af de ting bruges? Og kan det laves som en alm. arraylist?
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 18:56 #23
den der kan godt bruges jo.. men det har kun en metode til at smide nogen tal ind i din array... kan prøve at mit efter din kode
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 18:58 #24
super, jep, jeg er jo ikke nået så langt;-)
Men, bare så det er på lavt niveau og så så den kan sorter, det er vist det jeg mangler, hvis ellers jeg kunne få den til at add´e tal.
Avatar billede arne_v Ekspert
31. oktober 2004 - 19:00 #25
Du skal nok:

public void addNumber(int number)
    {
        numbers.add(new Integer(number));
    }

da en ArrayList kun kan gemme objekter ikke simple data typer.
Avatar billede arne_v Ekspert
31. oktober 2004 - 19:02 #26
Og du kan sortere din ArrayList med:

Collections.sort(numbers);
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 19:05 #27
Ikke helt tosset det der, her er hvad jeg har indtil nu:

import java.util.*;

public class Program
{
    private ArrayList numbers;
   
    public Program()
    {
   
      numbers = new ArrayList();
     
    }

    public void addNumber(int number)
    {
        numbers.add(new Integer(number));
    }
   
      public int numberOfNumbers()
    {
        return numbers.size();
    }
   
    public void listNumbers()
    {
        int index = 0;
        while(index < numbers.size()){
        System.out.println(+ index + " : " + numbers.get(index));
        index++;
    }
}
   
  }
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 19:06 #28
altså list numbers er bare en test for at se at de er kommet ind...men det virker nu med at add´e en int.
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 19:08 #29
import java.util.*;

public class Program
{
    private ArrayList numbers;
   
    public Program()
    {
   
      numbers = new ArrayList();
     
    }

    public void addNumber(int number)
    {
        numbers.add(new Integer(number));
    }

public void Sort()
{
Arrays.sort(numbers);
}
   
      public int numberOfNumbers()
    {
        return numbers.size();
    }
   
    public void listNumbers()
    {
        int index = 0;
        while(index < numbers.size()){
        System.out.println(+ index + " : " + numbers.get(index));
        index++;
    }
}
   
  }


nu bruger jeg ikke rigtig arraylist.. men mon man kan gøre noget lignende det jeg lige gjorde?
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 19:09 #30
import java.util.*;

public class Program
{
    private ArrayList numbers;
   
    public Program()
    {
   
      numbers = new ArrayList();
     
    }

    public void addNumber(int number)
    {
        numbers.add(new Integer(number));
    }

public void Sort()
{
Collections.sort(numbers);
}
   
      public int numberOfNumbers()
    {
        return numbers.size();
    }
   
    public void listNumbers()
    {
        int index = 0;
        while(index < numbers.size()){
        System.out.println(+ index + " : " + numbers.get(index));
        index++;
    }
}
   
  }

ellers sådan måske
Avatar billede arne_v Ekspert
31. oktober 2004 - 19:13 #31
import java.util.*;

public class Program {
    private ArrayList numbers;

    public Program() {
        numbers = new ArrayList();
    }

    public void addNumber(int number) {
        numbers.add(new Integer(number));
    }

    public int numberOfNumbers() {
        return numbers.size();
    }

    public void listNumbers() {
        int index = 0;
        while (index < numbers.size()) {
            System.out.println(+index + " : " + numbers.get(index));
            index++;
        }
    }
   
    public void sort() {
        Collections.sort(numbers);
    }
   
    public static void main(String[] args) {
        Program prg = new Program();
        prg.addNumber(3);
        prg.addNumber(2);
        prg.addNumber(1);
        prg.listNumbers();
        prg.sort();
        prg.listNumbers();
    }
}

output:

0 : 3
1 : 2
2 : 1
0 : 1
1 : 2
2 : 3
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 19:13 #32
den sidste er vist på sporet af noget. Den compiler, men kommer ikke med nogen sortering!? Hvordan sortere den dem? Kan jeg få en System.out.println? Jeg skal have lavet et test program der kan tjekke om de er sorteret korrekt...
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 19:16 #33
så skal du bare lave en løkke som printer den ud

for(int i = 0; i < numbers.size; i++)
System.out.println(numbers.get(i));
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 19:18 #34
hvordan sætter jeg den sammen med den anden?

  public void sort() {
        Collections.sort(numbers);
       
        for(int i = 0; i < numbers.size; i++)
System.out.println(numbers.get(i));
    }
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 19:19 #35
du kan bare smide den i sin egen

public void udskriv()
{
      for(int i = 0; i < numbers.size; i++)
System.out.println(numbers.get(i));

}
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 19:21 #36
den siger at size har private access i java.util.arraylist og vil ikke compile?
Avatar billede arne_v Ekspert
31. oktober 2004 - 19:22 #37
for(int i = 0; i < numbers.size(); i++)

() efter size !
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 19:23 #38
public void udskriv()
{
int y = numbers.size;
for(int i = 0; i < y; i++)
System.out.println(numbers.get(i));

}
Avatar billede arne_v Ekspert
31. oktober 2004 - 19:23 #39
Og du havde altså allerede en listNumbers metode !
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 19:23 #40
nåhhhh ja sorry ...

bruger heller aldrig arraylist: )


public void udskriv()
{
      for(int i = 0; i < numbers.size(); i++)
System.out.println(numbers.get(i));

}
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 19:27 #41
ok, det er jo glimrende. Jep, kan godt se jeg have den selv, men bliver sgu lidt forvirret engang imellem;-)
Godt, nu ser det ud til at den kan sortere efter laveste, hvordan laver jeg den modsatte?
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 19:28 #42
lige en tilføjelse. Hvordan ændrer jeg min addNumber så jeg ikke kan add tal < 0?
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 19:30 #43
ok, den her jeg her:
public void addNumber(int number) {
      if(number < 0){
          System.out.println("errror");
        }
              else{
      numbers.add(new Integer(number));
    }
}
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 19:31 #44
public void addNumber(int number) {
      if(number == 0){
          System.out.println("errror");
        }
              else{
      numbers.add(new Integer(number));
    }
}
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 19:32 #45
den er der styr på, hvordan laver jeg den sortering der sorterer efter højeste tal?
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 19:33 #46
der skal nej kan du lave en ny array om smide tallene derind.. kan lige prøve og fixe noget sammen
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 19:35 #47
to sekunder kom til at tænke på en metode i ArrayList.... Collections.reverse()
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 19:40 #48
det virker jo det shit. Okay, så er vi jo klar til den sidste mind-breaker;-)
Det jeg nu mangler er at lave en test klasse, der skal teste mit program.
Som det andet, simpelt.
Fx, teste om der er negative tal
Teste at tallene bliver sorteret korret, samt teste hvad der sker hvis de i forvejen er sorteret inden jeg beder dem om at blive det.
Avatar billede arne_v Ekspert
31. oktober 2004 - 19:41 #49
Du kunne også bruge en comparator til at styre sorteringen med:

import java.util.*;

public class Program2 {
    private ArrayList numbers;

    public Program2() {
        numbers = new ArrayList();
    }

    public void addNumber(int number) {
        numbers.add(new Integer(number));
    }

    public int numberOfNumbers() {
        return numbers.size();
    }

    public void listNumbers() {
        int index = 0;
        while (index < numbers.size()) {
            System.out.println(+index + " : " + numbers.get(index));
            index++;
        }
    }
   
    public void sort() {
        Collections.sort(numbers, new ReverseOrder());
    }
   
    public static void main(String[] args) {
        Program2 prg = new Program2();
        prg.addNumber(1);
        prg.addNumber(2);
        prg.addNumber(3);
        prg.listNumbers();
        prg.sort();
        prg.listNumbers();
    }
}

class ReverseOrder implements Comparator {
      public int compare(Object o1, Object o2) {
          return ((Integer)o2).intValue() - ((Integer)o1).intValue();
      }
      public boolean equals(Object obj) {
          return false;
      }
}
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 19:52 #50
Fx, teste om der er negative tal - om der er tal under 0?
Teste at tallene bliver sorteret korret - Det går man vel ud fra at den gør når man bruger en metode til det?
samt teste hvad der sker hvis de i forvejen er sorteret inden jeg beder dem om at blive det. - så sker der ikke noget for den sortere kun det som ikke er sorteret.. hvis der er kommet nyt ind i array'en siden sidst så vil man kunne.
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 19:56 #51
ja, det giver næsten sig selv. Det er et meget simpelt og ligetil program og også nemt at teste. Men, det er en øvelse i at lave extream programming, dvs. test før kodning. Jeg burde have lavet testen først, men da jeg har så voldsomt store problemer med at kode, har jeg lavet koden først, heh. Så denne dummy af et testprogram er jo i dette tilfælde ligegyldig, men kunne ved størrer projekter være nyttig. Derfor er jeg nødt til at lave det testprogram også.
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 20:03 #52
Du kan tjekke om der er negative numre ved igen at løbe din array igennem med en løkke

int[] beholder = new int[];
for(int i = 0; i < numbers.size(); i++)
{
if (numbers.get(i) < 0)
beholder[i] = numbers.get(i);
}

ved ikke om det virker kan ikke lige teste... men den skulle gerne smide alle negative tal ind i en array.. som du så kan printe ud senere
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:05 #53
ok, den skal så returnere et true eller false. Desuden skal denne kode ligge i en anden klasse der hedder test. Hvordan får jeg denne kode koblet sammen med min program kode?
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 20:11 #54
så smid denne kode ind i klassen test

public boolean tjeckTal()
{
for(int i = 0; i < numbers.size(); i++)
{
if (numbers.get(i) < 0)
beholder[i] = numbers.get(i);
}
if(beholder(0) < 0)
return false;
else
return true;
}


int[] beholder = new int[];

skal du skrive øverst i klassen.


hvis metoden skal have en array med så skal du selvfølgelig ændre på dette som det her

public boolean tjeckTal(int[] numbers)
{
for(int i = 0; i < numbers.size(); i++)
{
if (numbers.get(i) < 0)
beholder[i] = numbers.get(i);
}
if(beholder(0) < 0)
return false;
else
return true;
}



og  ved godt den tester på en sjov måde men det virker vist nok
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 20:13 #55
sorry

if(beholder(0) < 0)

skal være

if(beholder[0] < 0)
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:19 #56
Er det sådan er du mener?

import java.util.*;

public class test1
{
 
    private Program numbers;
 

  public test1()
    {
        // initialise instance variables
       
    }
   
    public boolean tjeckTal()
    {
        for(int i = 0; i < numbers.size(); i++)
        {
            if (numbers.get(i) < 0)
            beholder[i] = numbers.get(i);
        }
        if(beholder[0] < 0)
        return false;
        else
        return true;
}
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 20:23 #57
import java.util.*;

public class test1
{
 
  private Program numbers; // har du en classe som hedder Program?
  int[] beholder = new int[];

  public test1()
    {
        // initialise instance variables
       
    }
   
    public boolean tjeckTal()
    {
        for(int i = 0; i < numbers.size(); i++)
        {
            if (numbers.get(i) < 0)
            beholder[i] = numbers.get(i);
        }
        if(beholder[0] < 0)
        return false;
        else
        return true;
}
}
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:28 #58
ved:  int[] beholder = new int[];  siger den array dimension missing....
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:30 #59
den klasse jeg har der hedder Program er den vi lavede før som sorterer og alt det der....
Avatar billede arne_v Ekspert
31. oktober 2004 - 20:32 #60
Hvorfor lave er array udfra ArrayList med de ikke negative tal ?
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:32 #61
Jeg skal skrive en klasse, der kalder sorteringsprogrammet (altså min klasse "Program") med de testcases, jeg har beskrevet (i dette tilfælde om der er indtastet negative tal), og checker, at
resultatet er korrekt. Hver testcase skal returnere en sand/falsk for hvorvidt testen blev bestået. Hvis alle
tests er bestået, skal test-klassen melde, at hele testen blev bestået.
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 20:33 #62
int[] beholder = new int[1000];

der manglede  en størrelse på dit array
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:34 #63
ok, men nu kan den ikke resolve size; numbers.size?
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 20:34 #64
public boolean tjeckTal(ínt numbers)
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 20:35 #65
du skal huske at det en metode.. hvis den skal have parametre med sig fx et array  så skal man også skrive det

public boolean tjeckTal(ínt numbers)
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:36 #66
nu siger den int cannot be dereferenced? heh
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 20:36 #67
arne_v: Du har helt sikkert ret uanset hvad der bliver spurgt om;) du er en garvet programmør jeg har kun programmeret i 2 måneder hehe
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:38 #68
men fastpoint, det går jo fremragende, vi er der næsten. Måske arne v giver en hånd med igen?;-)
Jeg skal skrive en klasse, der kalder sorteringsprogrammet (altså min klasse "Program" som vi lavede før) med de testcases, jeg har beskrevet (i dette tilfælde om der er indtastet negative tal), og checker, at
resultatet er korrekt. Hver testcase skal returnere en sand/falsk for hvorvidt testen blev bestået. Hvis alle
tests er bestået, skal test-klassen melde, at hele testen blev bestået.
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 20:41 #69
min kode før tester godt nok kun om der er et negativt tal i index et af det array jeg oprettede... det fordi jeg tænkte så snart der er et tal deri så kan du regne ud at der er negative tal;) så den skal lige laves lidt om ..

og til den der fejl.. har jeg aldrig hørt før... måske er det fordi din parameter er en Arraylist og ikke bare en Array...

ved ikke om man kan skrive sådan her

public boolean tjeckTal(ArrayList numbers)
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:47 #70
kunne man lave noget i dur med dette?:


    Public boolean testForMinus(int number);
    {
      if(number < 0){
          return false;
        }
              else{
                  return true;

    }

jeg kan ikke få det til at virke, men den skal jo hente number fra de numbers der ligger i vores array i klassen Program og teste om de er mindre end 0. Kan man lave en simpel tilføjelse til ovenstående kode så det kommer til at virke?
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:48 #71
jeg har som field skrevet: private Program number;
er det helt hen i vejret?
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 20:50 #72
Public boolean testForMinus(int number);
    {
      if(number < 0)
      return false;
          else
return true;

    }

det kan du sagtens gøre ja! du skal bare.. men så skal du huske at bruge ArrayList's get() metode til at hente nummeret
Avatar billede arne_v Ekspert
31. oktober 2004 - 20:51 #73
Eksempel som checker for om sorteringen virker:

import java.util.*;

public class Program3 {
    private ArrayList numbers;

    public Program3() {
        numbers = new ArrayList();
    }

    public void addNumber(int number) {
        numbers.add(new Integer(number));
    }

    public int numberOfNumbers() {
        return numbers.size();
    }

    public void listNumbers() {
        int index = 0;
        while (index < numbers.size()) {
            System.out.println(+index + " : " + numbers.get(index));
            index++;
        }
    }
   
    public void sort() {
        Collections.sort(numbers);
    }
   
    public ArrayList getNumbers() {
        return numbers;
    }
}

og:

import java.util.*;

public class TestClass {
    public static void main(String[] args) {
        Program3 prg = new Program3();
        prg.addNumber(3);
        prg.addNumber(2);
        prg.addNumber(1);
        prg.sort();
        ArrayList numbers = prg.getNumbers();
        System.out.println("checkSort = " + checkSort(numbers));
    }
    private static boolean checkSort(ArrayList numbers) {
        for(int i = 1; i < numbers.size(); i++) {
            if(((Integer)numbers.get(i)).intValue() < ((Integer)numbers.get(i-1)).intValue()) {
                return false;
            }
        }
        return true;
    }
}
Avatar billede arne_v Ekspert
31. oktober 2004 - 20:53 #74
Hvis der også skal testes for postive tal:

import java.util.*;

public class TestClass {
    public static void main(String[] args) {
        Program3 prg = new Program3();
        prg.addNumber(3);
        prg.addNumber(2);
        prg.addNumber(1);
        prg.sort();
        ArrayList numbers = prg.getNumbers();
        System.out.println("checkSort = " + checkSort(numbers));
        System.out.println("checkPositive = " + checkPositive(numbers));
    }
    private static boolean checkSort(ArrayList numbers) {
        for(int i = 1; i < numbers.size(); i++) {
            if(((Integer)numbers.get(i)).intValue() < ((Integer)numbers.get(i-1)).intValue()) {
                return false;
            }
        }
        return true;
    }
    private static boolean checkPositive(ArrayList numbers) {
        for(int i = 0; i < numbers.size(); i++) {
            if(((Integer)numbers.get(i)).intValue() < 0) {
                return false;
            }
        }
        return true;
    }
}
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:54 #75
det ser fornuftigt ud Arne, men er der mulighed for at lave koden uden: public static void main(String[] args) den æder mit program ikke og den falder lidt udenfor hvad jeg ved og har haft om?
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 20:57 #76
du kan bare slette den linie... med main.. hvis du kun skal bruge metoderne;)
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 20:57 #77
Public boolean testForMinus(int number);
    {
      if(numbers.get(i) < 0){
          return false;
        }
              else{
                  return true;

    }
}

det må være noget i stil med dette så? Den æder den dog fortsat ikke???
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:09 #78
har I givet op drenge, så tæt på målet?
Avatar billede arne_v Ekspert
31. oktober 2004 - 21:11 #79
Du kan godt kalde i en anden kontekst end main.

Pointen er:
  Program klassen indeholder en metode getNumbers
  test koden kalder den så den har ArrayList'en
  test metoderne kaldes med den
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:15 #80
jep, men hvis jeg bruger numbers.get(i) i min test klasse så kan den ikke solve variable i? Det er som om at der ikke er nogen forbindelse mellem min testklasse og programmet, se:

import java.util.*;

public class Test
{
   
    private Program number;
 
 
    public Test()
    {
        // initialise instance variables

    }


    Public boolean testForMinus()
    {
      if(numbers.get(i) < 0){
          return false;
        }
              else{
                  return true;

    }
}
 
Kan du få det til at fungere på en eller anden smart måde uden at det bliver for avanceret?
Avatar billede arne_v Ekspert
31. oktober 2004 - 21:18 #81
Lån fra min kode:

import java.util.*;

public class Test
{
 
    private Program prg;
 
    public Test()
    {
        // initialise instance variables
    }

    public boolean testForMinus()
    {
        ArrayList numbers = prg.getNumbers();
        for(int i = 0; i < numbers.size(); i++) {
            if(((Integer)numbers.get(i)).intValue() < 0) {
                return false;
            }
        }
        return true;
    }
}
Avatar billede arne_v Ekspert
31. oktober 2004 - 21:19 #82
Og det forudsætter altså at din Program klasse har fået getNumbers metoden !
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 21:21 #83
det vist fordi numbers listen ikke ligger i den klasse..
tænkte mere på du skulle sige
numbers.get(i) fra den klasse den ligger i og sende det tal hen i

Public boolean testForMinus(int PARAMETEREN);
    {
      if(number < 0){
          return false;
        }
              else{
                  return true;

    }
}
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:21 #84
import java.util.*;

public class Program

{
    private ArrayList numbers;

    public Program() {
        numbers = new ArrayList();
    }

    public void addNumber(int number) {
      if(number < 0){
          System.out.println("errror");
        }
              else{
      numbers.add(new Integer(number));
    }
}

    public int numberOfNumbers() {
        return numbers.size();
    }

    public void listNumbers() {
        int index = 0;
        while (index < numbers.size()) {
            System.out.println(+index + " : " + numbers.get(index));
            index++;
        }
    }
   
    public void sort() {
        Collections.sort(numbers);
       
    }
   
    public void sortReverse() {
    Collections.reverse(numbers);
    }
       
       
  public void udskriv()
{
      for(int i = 0; i < numbers.size(); i++)
System.out.println(numbers.get(i));

}
}

Her er min program kode....det ser ikke ud til at den er der, eller? Hvordan skriver jeg den?
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:23 #85
jeg kan ikke ligge den i samme klasse, test klassen skal være en klasse for sig selv, derfor skal listen hentes over i testklassen, men kan ikke få det til at virke...
Avatar billede arne_v Ekspert
31. oktober 2004 - 21:25 #86
Se 20:51:12
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 21:25 #87
Public boolean testForMinus(int PARAMETEREN);

så skal den metode have en array med som parameter og ikke tal tal: )
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:30 #88
sorry, den missede jeg lige! Men, ok, nu har jeg smidt den ind, begge klasser compiler, men når jeg vil køre min test siger den NullPointerExeption; Null og pejer på        ArrayList numbers = prg.getNumbers();
Avatar billede arne_v Ekspert
31. oktober 2004 - 21:32 #89
Har din:

    public Test()
    {
        // initialise instance variables
    }

det der skal til f.eks.:

    public Test()
    {
        prg = new Program();
        prg.AddNumber(3);
        prg.AddNumber(47);
        prg.sort();
    }

?
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:38 #90
Kanon nu compiler den:
Jeg lavede lige en test på at se om den også tjekker om der er minus tal, det gør den men den tjekker forkert!! Her er PROGRAM KODEN:

import java.util.*;

public class Program

{
    private ArrayList numbers;

    public Program() {
        numbers = new ArrayList();
    }

    public void addNumber(int number) {
     
      numbers.add(new Integer(number));
    }


    public int numberOfNumbers() {
        return numbers.size();
    }

    public void listNumbers() {
        int index = 0;
        while (index < numbers.size()) {
            System.out.println(+index + " : " + numbers.get(index));
            index++;
        }
    }
   
    public void sort() {
        Collections.sort(numbers);
       
    }
   
    public void sortReverse() {
    Collections.reverse(numbers);
    }
       
       
  public void udskriv()
{
      for(int i = 0; i < numbers.size(); i++)
System.out.println(numbers.get(i));

}

  public ArrayList getNumbers() {
        return numbers;
    }
 
    }

og her er TEST KODEN:


import java.util.*;

public class Test4
{
 
    private Program prg;
 
    public Test4()
    {
        prg = new Program();
        prg.addNumber(3);
        prg.addNumber(23);
        prg.sort();

        // initialise instance variables
    }

    public boolean testForMinus()
    {
        ArrayList numbers = prg.getNumbers();
        for(int i = 0; i < 0; i++) {
            if(((Integer)numbers.get(i)).intValue() < 0) {
                return false;
            }
        }
        return true;
    }
}

hvad hulan gør jeg forkerT????
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:41 #91
når jeg kører testen melder den true uanset om jeg har tastet et minus-tal ind eller ej???
Avatar billede arne_v Ekspert
31. oktober 2004 - 21:42 #92
testForMinus vil returnere false hvis der er negative tal ellers true - er det ikke OK ?
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:43 #93
okay, nu kan jeg se hvad der er galt, det er jo fordi at vi definerer de tal den skal teste på i:

prg = new Program();
        prg.addNumber(3);
        prg.addNumber(23);
        prg.sort();

de tal skal den jo hente fra den array jeg har lavet med de indtastede tal....
Hvordan?
Avatar billede arne_v Ekspert
31. oktober 2004 - 21:43 #94
Hov !

for(int i = 0; i < 0; i++) {

skal være:

for(int i = 0; i < numbers.size(); i++) {
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:44 #95
jep, den har jeg ændret, men tror at fejlen ligger i:
prg = new Program();
        prg.addNumber(3);
        prg.addNumber(23);
        prg.sort();
3 og 23 er jo positive og den melder true lige meget hvad. Hvis jeg ændrer 3 til -3 så melder den false uanset hvad jeg ellers taster ind....
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 21:45 #96
Det ser endelig ud som om din kode er ved at fungere... mit hoved er også godt ristet efterhånden hehe
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:46 #97
hehe så skulle du mærke mit....
Avatar billede arne_v Ekspert
31. oktober 2004 - 21:47 #98
Ja selvfølgelig skal de tal du indlæser stoppes ind i samme array som det du tester på ...
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:48 #99
men hvordan gør jeg det?

prg = new Program();
        prg.addNumber(3); <- hvordan?
        prg.addNumber(23);
        prg.sort();
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:50 #100
p.s fastpoint, hvordan hulan er du blevet så sej til at programmere på 2 måneder? Bruger du nogle bestemte tutorials på nettet eller hvordan har du gjort? Jeg har forsøgt længe og har sgu stadig ikke fattet helt hvad det går ud på....synes ikke de tutorials jeg finder er til megen gavn...
Avatar billede arne_v Ekspert
31. oktober 2004 - 21:52 #101
Har du noget indlæsnings kode ?
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:54 #102
hvad er indlæsnings kode?
Avatar billede arne_v Ekspert
31. oktober 2004 - 21:56 #103
Kode som læser data ind.

Ifølge 21:44:56 så læser du noget data ind ?
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 21:58 #104
21:38:27 viser jeg koden. Jeg vil tro den du henviser til er:

public void addNumber(int number) {
     
      numbers.add(new Integer(number));
    }
det er jo de tal jeg smider ind her, som den skal teste på.....
Avatar billede arne_v Ekspert
31. oktober 2004 - 22:00 #105
Den kode ligger et tal ind i listen.

Den indlæser ikke et tal fra tastatur eller fil.
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 22:03 #106
vær opmærksom på at jeg kører programmet i BlueJ!
Her har jeg mulighed for at oprette objekter, dvs. når jeg bruger addNumber metoden, taster jeg fra tastatur manuelt nogle tal ind. De tal gemme den i min array og det er de tal jeg skal teste på... dvs. i koden

prg = new Program();
        prg.addNumber(3); <- her!
        prg.addNumber(23);
        prg.sort();

skal jeg teste på de tal jeg har tastet ind og ikke 3 og 23!! Jeg har forsøgt med number i stedet for 3, men den æder den ikke. Hvordan får jeg ført mine numbers fra array´en ind her så der kan blive testet på dem???
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 22:11 #107
det er alt jeg mangler!!!
Avatar billede arne_v Ekspert
31. oktober 2004 - 22:12 #108
Jeg kender ikke BlueJ.

Men når du kalder addNumber må du vel ave mulighed for at angive hvilket
objekt den skal kaldes på ?

Og det skal vel så være prg.
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 22:14 #109
hmm nej, jeg laver et objekt fra Program klassen og et fra test. Så vælger jeg addNumber metoden og taster nogle tal ind. Derefter vælger jeg fra mit test objekt testForMinus metoden.
Men kan jeg ikke få de værdier ind i min contructor på test-klassen, som jeg har indtastet ved hjælpe af min addNumber metode???
Avatar billede arne_v Ekspert
31. oktober 2004 - 22:19 #110
Det lyder som om det er lidt svært at knytte 2 objekter sammen i det miljø !
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 22:21 #111
jeg tror bare vi misforstår hinanden. De tal jeg smider ind i min addNumber metode skal bruges i min TestForMinus metode. Der er 2 klasser, kan man ikke bare føre de tal fra den ene over til den anden? Eller henvise fra den ene til den anden?
Avatar billede arne_v Ekspert
31. oktober 2004 - 22:22 #112
En fuske løsning er:

public class Program {
    public static Program theoneandonly;
    public Program() {
        ...
        theoneandonly = this;
    }
    ...
}

og

public class Test4
{
    private Program prg;
    public Test4()
    {
        prg = Program.theoneandonly;
    }
    ...
}
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 22:57 #113
Så er det endelig kommet til at virker. Det jeg gjorde var i min contructor at sige
public Test4(Program program)
    {
        prg = program;
     
så pejer jeg på mit program når jeg åbner testen hvorefter den tjekker på de indtastede værdier.

Hvordan gør jeg hvis jeg vil dele pointsne?
Avatar billede arne_v Ekspert
31. oktober 2004 - 22:59 #114
Du beder fatspoint ligge et svar, venter på han gør det, markerer begge navne
i combo boxen, klikker accepter - så deles point ligeligt.

Hvis du vil dele point skævt er der en advanced knap.
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 23:07 #115
fastpoint læg et svar så du kan få nogle points.
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 23:10 #116
Tag for det: ) og godt at se koden virker;)
Avatar billede bagnavnet Nybegynder
31. oktober 2004 - 23:13 #117
så siger jeg tusind tak for hjælpen, det var aldrig gået uden jer. Tak!!
Avatar billede fastpoint Nybegynder
31. oktober 2004 - 23:15 #118
hehe tak for udfodringen! lidt hjerngymnastik: )
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