CaSh Skrevet 29. april 2004 Del Skrevet 29. april 2004 La oss si at jeg har en tabell bestående av 5 long tall. 1 2 3 3 4 Hvordan kan jeg søke gjennom tabellen og finne to like tall også printe hele tabellen ut på følgende måte: 1 2 Fant match 3 Fant match 3 4 Noen som kan hjelpe? Lenke til kommentar
runeb Skrevet 29. april 2004 Del Skrevet 29. april 2004 Kan du beskrive problemstillingen litt mer detaljert kanskje? Hvordan ligger tallene i tabellen? Er de alltid sorterte slik det er i eksempelet ditt? Er det alltid et spesielt tall det er snakk om, eller alle tall det fins eksakt to (eller to eller flere) av? Lenke til kommentar
DJViking Skrevet 29. april 2004 Del Skrevet 29. april 2004 Opprett to pekere i arrayet og traverser gjennom det mens du sammenligner de to pekerne og deretter inkrementere pekerne til neste nivå Lenke til kommentar
remlas Skrevet 4. mai 2004 Del Skrevet 4. mai 2004 long[] tallene = new long[5]; la oss si at denne er fylt med tilfeldige tall. for( int i=0;i<tallene.length;i++){ long h=tallene; if(h!=i){//Skall ikke skjekke om tallet er likt seg selv if(h==tallene){ System.out.println("fant to like ved indeks nr "+h +" og "+ i"); // dette gjør ikke noe med tabellen men sier bare ifra hvis du har flere like. } } } Lenke til kommentar
MailMan13 Skrevet 5. mai 2004 Del Skrevet 5. mai 2004 (endret) for( int i=0;i<tallene.length;i++){ long h=tallene[i]; if(h!=i){//Skall ikke skjekke om tallet er likt seg selv if(h==tallene[i]) ..... Dette så litt rart ut, du sammenligner tallet med tallets index i arrayet, det er ikke mye mening i det. Den andre if setningen også meningsløs siden du aldri manipulerer h mellom h=tallene[h] og if(h==tallene) Endret 5. mai 2004 av MailMan13 Lenke til kommentar
Orjanp Skrevet 5. mai 2004 Del Skrevet 5. mai 2004 (endret) long[] tallene = new long[5];la oss si at denne er fylt med tilfeldige tall. for( int i=0;i<tallene.length;i++){ long h=tallene; if(h!=i){//Skall ikke skjekke om tallet er likt seg selv if(h==tallene){ System.out.println("fant to like ved indeks nr "+h +" og "+ i"); // dette gjør ikke noe med tabellen men sier bare ifra hvis du har flere like. } } } Den vil i praksis ikke fungerer fordi du i starten af for-setningen satte h lik tallet, og rett etterpå skjekker du om h er lik tallet, noen den alltid vil være. Du har også en skjekk på om h er forskjellig fra i, noe den alltid vil være hvis de tilfeldige tallene er større eller lik 5. Det er dessuten ikke noe poeng i å teste om verdien til h er lik indeksen i tabellen. int [] tabell = new tabell[5]; for(int i = 0; i < tabell.length; i++) for(int j = i + 1; j < tabell.lengt; j++) { int verdi = tabell[i]; if(tabell[i] == tabell[j]) System.out.println("Verdien i index " + i + " er lik verdien i index " + j + " og har verdi " + tabell[i]); } Nå er javaen min litt rusten, men jeg tror den skal fungere. EDIT: Det var forsåvidt ikke svar på spørsmålet ditt. Koden min finner bare to like og skriver de ut. int [] tabell = new tabell[5]; boolean match = false; for(int i = 0; i < tabell.length; i++) { for(int j = i + 1; j < tabell.lengt; j++) { int verdi = tabell[i]; if(tabell[i] == tabell[j]) { match = true; break; //Hopper ut av for-setning 2. } } if(match) System.out.println("Fant match " + tabell[i]); else System.out.println(tabell[i]); match = false; } Tror denne skulle svare på spørsmålet ditt. Ørjan... Endret 5. mai 2004 av Orjanp Lenke til kommentar
Neo Skrevet 5. mai 2004 Del Skrevet 5. mai 2004 long[] tallene = new long[5];la oss si at denne er fylt med tilfeldige tall. for( int i=0;i<tallene.length;i++){ long h=tallene; if(h!=i){//Skall ikke skjekke om tallet er likt seg selv if(h==tallene){ System.out.println("fant to like ved indeks nr "+h +" og "+ i"); // dette gjør ikke noe med tabellen men sier bare ifra hvis du har flere like. } } } Var du på en snurr når du skrev dette eller? Støtter meg oppunder orjanp sitt forslag. Nå venter vi spent på trådstarters tilbakemelding... Lenke til kommentar
remlas Skrevet 5. mai 2004 Del Skrevet 5. mai 2004 Ja jeg tokk skrekkelig feil der ja. skulle ta toget fra oslo som gikk 2137 og som dere ser var mitt innlegg lagt inn kl 2130 og det tar jo tross allt lit tid å gå. rakk ikke toget foresten. men men kom til å tenke på det i når jeg gikk av toget. Hm skrev jeg bare en for setning.???? og det gjorde jeg vist. Men må si at informasjonen om hva som var lagret i tabellen var noe defust. hvis feks tallene er sortert i stigende rekkefølge burde man egentlig ikke gjennomkjøre hele tabellen i det heletatt. da brude man teste på den mitterste eller den mitterste-1 (hvis tabell lengden ikke er et partall.) og videre skjekke på det mitterste tallet i de resterende tallene. dette vil ha stor betydning for ytelsen ved søking hvis tabellen er stor. forenklet kode vil være class test{ public static void main(String[]a){ long[] l = new long[5]; l[0]=1; l[1]=2; l[2]=3; l[3]=3; l[4]=4; for ( int i = 0; i<l.length; i++){ long hjelper=l; for ( int j = 0; j<l.length; j++){ if(hjelper==l[j] && j!=i){ System.out.println("fant match ved indeks "+i); break; } } } } } og hvis vi skal være pirkete så vil ikke koden til ørjan fungere fordi du kan ikke opprette en int tabell med int tabell = new tabell[5]; men ved å skrive int tabell = new int[5]; men det det skulle jo være long som i koden over. Lenke til kommentar
remlas Skrevet 5. mai 2004 Del Skrevet 5. mai 2004 Foresten hvis dere har lyst på en liten utfording så kan dere jo skjekke mitt problem! unde Filbanefeil i java... Lenke til kommentar
Orjanp Skrevet 5. mai 2004 Del Skrevet 5. mai 2004 Når du skriver kode, bruk [%code] og [%/code], uten %, og bruk mellomrom som tab. Bare ett lite tips for at koden skal bli lettere å lese. Lenke til kommentar
CaSh Skrevet 5. mai 2004 Forfatter Del Skrevet 5. mai 2004 long[] tallene = new long[5];la oss si at denne er fylt med tilfeldige tall. for( int i=0;i<tallene.length;i++){ long h=tallene; if(h!=i){//Skall ikke skjekke om tallet er likt seg selv if(h==tallene){ System.out.println("fant to like ved indeks nr "+h +" og "+ i"); // dette gjør ikke noe med tabellen men sier bare ifra hvis du har flere like. } } } Ja denne vil aldri fungere. Lenke til kommentar
CaSh Skrevet 5. mai 2004 Forfatter Del Skrevet 5. mai 2004 (endret) Jeg fikk til koden etter mye om og men. Slik ser den ut: import java.util.*; public class LongTest { private static final long[] array = { 1 , 2 , 3 , 3 , 4 , 10 , 1 }; public static void main( String[] argv ) { Map m = new HashMap(); for ( int i = 0; i < array.length; i++ ) { Long ll = new Long( array[i] ); Count count = (Count) m.get( ll ); if ( count == null ) m.put( ll , new Count() ); else count.n++; } for ( int i = 0; i < array.length; i++ ) { Count count = (Count) m.get( new Long( array[i] ) ); String prefix = ""; if ( count.n > 1 ) prefix = "Found match "; System.out.println( prefix + array[i] ); } } private static final class Count { private int n=1; } } Endret 5. mai 2004 av CaSh Lenke til kommentar
Rolf_OLE Skrevet 6. mai 2004 Del Skrevet 6. mai 2004 (endret) I all kjedsomhet måtte jeg bare finne på noe bedre enn å skrive diplomen min, og hadde en liten go på å skrive programmet. Veit at det blir mye pastet på en side, men Og nei, den er ikke mye optimalisert! Kort fortalt gjør den dette: Lage en en tilfeldig tallrekke, med typisk mange like tall. sortere tabellen og fjerne duplikate tall, som legges i en egen liste skrive ut den sorterte listen, for hvert element i listen søkes det etter om finnes fler av det tallet import java.util.Vector; import java.util.Random; public class JegKjederMegSkikkelig { private Vector ekstraTall = new Vector(); public JegKjederMegSkikkelig(int antallTall) { Vector originalTabell = lagMasseTilfeldigeMenNoenDuplikatTall(antallTall); Vector sortertTabell = sorterTalleneOgLeggDuplikaterIEgenListe(originalTabell); printUtTallene(sortertTabell, ekstraTall); } private Vector sorterTalleneOgLeggDuplikaterIEgenListe(Vector originalTabell) { Vector sortertTabell = new Vector(); //Legger til det første fra originaltabellen i sorterte lista for å ha et utgangspunkt sortertTabell.add(originalTabell.elementAt(0)); //Fjerner ett og et element fra den originale listen for (int originalNr = 1; originalNr < originalTabell.size(); originalNr++) { Long originalInt = (Long) originalTabell.elementAt(originalNr); //Og legger dem i en sortert liste for (int sortertNr = 0; sortertNr < sortertTabell.size(); sortertNr++) { Long sortertInt = (Long) sortertTabell.elementAt(sortertNr); //Hvis originalIntegeren er den samme som en som ligger i den sorterte listen, legges den blant ekstratallene if(originalInt.intValue() == sortertInt.intValue()) { ekstraTall.add(originalInt); break;//hopp til neste originalInt } //Hvis originalInt > sortertInt skal den legges til blant de sorterte else if(originalInt.intValue() > sortertInt.intValue()) { sortertTabell.add(sortertNr, originalInt); break; } } } return sortertTabell; } private void printUtTallene(Vector sortertTabell, Vector ekstraTallene) { for (int i = sortertTabell.size()-1; i >= 0; i--) { Long sorterInt = (Long) sortertTabell.elementAt(i); System.out.println(sorterInt); for (int ekstraTallNr = 0; ekstraTallNr < ekstraTallene.size(); ekstraTallNr++) { Long ekstraInt = (Long) ekstraTallene.elementAt(ekstraTallNr); if(sorterInt.intValue() == ekstraInt.intValue()) System.out.println(ekstraInt); } } } private Vector lagMasseTilfeldigeMenNoenDuplikatTall(int antallTall) { Vector originalTabell = new Vector(); Random randomgenerator = new Random(); for (int tallNr = 0; tallNr < antallTall; tallNr++) originalTabell.add(new Long(randomgenerator.nextInt(tallNr + 1))); return originalTabell; } public static void main(String[] args) { new JegKjederMegSkikkelig(100); } } Endret 6. mai 2004 av Rolf_OLE Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå