Avatar billede frankedrengen Nybegynder
07. februar 2014 - 09:58 Der er 8 kommentarer og
1 løsning

hjaelp til opgave paa Practice It (arrays)

Hej eksperten, jeg skal skrive en metode der returnere true hvis array1 indeholder samme frekvens af tal som array2. Jeg faar dog en fejl paa sidste test (returnere false).

public class PracticeItContains {
   
    public static void main(String[] args) {
        int[] array1 = {1, 2, 1, 2, 3};
        int[] array2 = {1, 2, 3};
        int[] array3 = {1, 6, 2, 1, 4, 1, 2, 1, 8};
        int[] array4 = {1, 2, 1};
        int[] array5 = {8, 8, 8, 8, 4, 8, 8, 8, 8, 2, 8, 8, 8, 8, 8, -1, 8};
        int[] array6 = {8, 8, 8, 8, 8};
       
        boolean result = contains(array5, array6);
        System.out.println(result);
    }
       
   
    public static boolean contains(int[] array1, int[] array2) {
        boolean result = false;
        int condition = (array1.length - array2.length) + 1;
        int temp = 0;
        int count = 0;
        for (int i = 0; i < condition; i++) {
            if (array2[0] == array1[i]) {
                temp = i;
                for (int j = 0; j < array2.length; j++) {
                    if (array2[j] == array1[temp]) {
                        count++;
                        temp++;
                    }
                }
            }
            if (count != array2.length) {
                result = false;
                temp = 0;
                count = 0;                       
            } else {
                result = true;
            }     
        }
    return result;
    }
   
}
Avatar billede bvirk Guru
07. februar 2014 - 14:34 #1
Hvordan er 'samme frekvens af tal' defineret - skal der blot opræde de samme elementer i fællesmængden eller skal de også være i samme rækkefølge.

Har a og b samme frekvens når
a={1,2,3}
b={2,1}
Avatar billede frankedrengen Nybegynder
07. februar 2014 - 14:42 #2
de skal have samme raekkefoelge

a = {1,3,1,2,1,4};
b = {1,2,1};
true
Avatar billede bvirk Guru
07. februar 2014 - 15:40 #3
umiddelbart -
if (count != array2.length)

så er array2 ikke fundet i array1, lige på DEN position i Array1. Skal der ikke ledes videre!
Hvilken effekt har placeringen af 
  return result
på at der bliver ledt videre?
Avatar billede bvirk Guru
07. februar 2014 - 16:21 #4
indikationen i #3 var lidt ved siden af, men det drejer sig stadig om hvordan yderste lykke afsluttes - leg med System.out.println("I="+i); forskellige steder.
Avatar billede frankedrengen Nybegynder
07. februar 2014 - 20:49 #5
Tak for svaret men synes desvaerre stadig jeg sidder fast. Jeg har proevet mange slutninger i det sidste loop men der opstaar bare en ny fejl. Koden virker fint for metodekald contains(array1, array2) og for contains(array3, array4)  men ikke for contains(array5, array6), kan ikke se hvor fejlen er?
Avatar billede bvirk Guru
07. februar 2014 - 22:50 #6
Ok - det er jo en lille ting, så du får hvad jeg anser som svaret:

Når du havner i
..
} else {
    result = true;

hvor variabel 'i' peger på position 10 i array1 (der efterfølges af 5 ottetaler) er der fundet et match med de fem ottetaler i array2 er vi færdig - har fundet array2 i array1 og skal bare afslutte med true
Som din kode er forsættes i ydeste 'for' lykke og ender med at undersøge om {8,8,8,-1,8} er i array2 og returnerer dermed false.

- det kan evt. laves sådan

..
} else {
    result = true;
    break;

Idet break bryder ud af 'for' løkken.
Avatar billede bvirk Guru
07. februar 2014 - 23:07 #7
NB
Der er 2 lidt forskellige grunde til at det lykkedes med henholdsvis array1,array2 og array3,array4

Godt på vej ønskes du videre fornøjelse med at få det rutine i konklusion på hvad der foregår.
Avatar billede frankedrengen Nybegynder
08. februar 2014 - 11:13 #8
1000 tak for svaret.
Avatar billede bvirk Guru
09. februar 2014 - 18:07 #9
Selvtak - fornøjelsen er også lidt på min side. Med anvendelsen af 'return' som aktiv del afviklingssekvensen samt et par andre cowboytricks kan 'contains(...)' reduceres til

public static boolean contains(int[] heystack, int[] needle) {
        for (int i = 0,j; i <= heystack.length - needle.length; i++) {
            for (j=needle.length-1;j>=0 && needle[j] == heystack[i+j]; j--);
            if (j==-1) return true;
        }
        return false;

Prøv at søge på
  strindex(char s[], char t[])

I følgende 1988 udgave af Dennis Ritchi og Brian Kerninghans legendariske bog.

http://net.pku.edu.cn/~course/cs101/2008/resource/The_C_Programming_Language.pdf

Selvom det handler om et sprog med pointer kan mange eksempler godt laves i Java vha. indekser - synes jeg, men det kan måske være fordi jeg forstår hvad der menes i C
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

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