Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse

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

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
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 av MailMan13
Lenke til kommentar
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 av Orjanp
Lenke til kommentar
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? :dontgetit:

Støtter meg oppunder orjanp sitt forslag. Nå venter vi spent på trådstarters tilbakemelding...

Lenke til kommentar

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
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

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 av CaSh
Lenke til kommentar

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 av Rolf_OLE
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...