Gå til innhold

fylle array med bokstaver tilfeldig


Anbefalte innlegg

hey, MÅ bli ferdig med en grunnleggende programmering oppgave, men vet ikke helt hvordan jeg skal løse 1 (eller muligens 2) av problemene, oppgaven lyder slik:

OBS: jeg SPØRR ikke om hjelp til hele oppgaven, for å hjelpe meg trenger du ikke lese oppgaveteksten rett under, hopp ned til neste OBS.

 

Lag en tegntabell på 7000 elementer. Fyll denne med tilfeldige bokstaver, f.o.m. A t.o.m.

G. Bare store bokstaver! Bruk Math.random(), som gir en uniform fordeling av tall

mellom 0.0 og 1.0.

• Så skal innholdet i tabellen sorteres i alfabetisk rekkefølge. Bruk ferdig en definert metode

i klassen Arrays i java.util-biblioteket. Her finner du dokumentasjonen for klassen:

http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html

PS: Husk å skrive følgende import deklarasjon: import java.util.Arrays;

• Etter sorteringen: Søk etter et element som inneholder en A og skriv ut indeksverdien til

dette elementet, søk så etter et element som inneholder en B og skriv ut indeksverdien, søk

etter en C, osv. Søkingen skal gjøres på en effektiv måte! Bruk en metode fra Arrayklassen

også her.

• Se på indeksverdien: Indeksverdien for en A skal være i området 0 til ca. 1000,

indeksverdien til en B skal være i området ca. 1000 til ca. 2000, osv. Indeksverdien for en

G skal være i området ca. 6000 til 6999.

 

 

 

OBS: teksten over er IKKE viktig for å svare på spørsmålet, kun for de nysgjerrige

 

 

jeg har naturligvis starter med å mekke charsene A B C D E F G, mekket meg en tabel int tab=new tab[7000];

lagd med math.random koden for å få tallene fra 0->7000 (tror jeg da, men d er ikke dette som er viktig uansett)

 

DET jeg lurer på er: hvordan kan jeg tildele disse charene til arrayet på en slik måte at de ikke overkjører hverandre om og om igjen? finner ingen måte å gjøre slik at de ikke fyller et slot som allerede er opptatt.

er det eventuelt en måte å tildele dem vor man unngår denne problemstillinga?

 

setter stor pris på rask respons :9

Lenke til kommentar
Videoannonse
Annonse

Kan det hende du har misforstått oppgaven litt?

 

Her er ca slik jeg ville ha løst den (det er lenge siden jeg programmerte i Java, så dette blir sikkert ikke helt riktig når det gjelder syntaks):

 

char[] bokstaver = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char[] tabell = new char[7000];

for (int i = 0; i < 7000; i++) {
 tabell[i] = bokstaver[(int)(Math.random() * 8)];
}

 

Poenget med "Math.random() * 8" er å gi et tilfeldig tall mellom 0 og 7 (fra 'A' til 'G'). Jeg er litt usikker på om jeg bruker Math.random() riktig her.

 

For å sortere kan du vel bruke Array.sort()...?

 

Håper jeg ikke er helt på viddene. Ble du noe klokere? :-)

Endret av geir_a
  • Liker 1
Lenke til kommentar

sånn da var det i boks, tusen takk for hjelpen, brukte din kode som grunn, håper det er greit :)

 

her er løsninga om noen i fremtiden skulle trenge den :) :

 

package minePrograms;

import java.util.*;

 

public class oppgave7a {

 

 

public static void main(String[] args) {

char[] tabell=new char[7000];

char[] bokstaver={'A', 'B', 'C', 'D', 'E', 'F', 'G'};

double fix;

double fix2;

int fix3;

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

fix=Math.random();

fix2=fix*7;

fix3=(int)fix2;

tabell = bokstaver[fix3];

}

 

Arrays.sort(tabell);

char searchValue = 'A';

int intResult = Arrays.binarySearch(tabell,searchValue);

System.out.println(intResult);

 

char searchValueB = 'B';

int intResultB =Arrays.binarySearch(tabell, searchValueB);

System.out.println(intResultB);

 

char searchValueC = 'C';

int intResultC =Arrays.binarySearch(tabell, searchValueC);

System.out.println(intResultC);

 

char searchValueD = 'D';

int intResultD =Arrays.binarySearch(tabell, searchValueD);

System.out.println(intResultD);

 

char searchValueE = 'E';

int intResultE =Arrays.binarySearch(tabell, searchValueE);

System.out.println(intResultE);

 

char searchValueF = 'F';

int intResultF =Arrays.binarySearch(tabell, searchValueF);

System.out.println(intResultF);

 

char searchValueG = 'G';

int intResultG =Arrays.binarySearch(tabell, searchValueG);

System.out.println(intResultG);

 

}

 

 

}

Lenke til kommentar

Ser jo greit nok ut, men jeg ville laget en funksjon for søket. Når noe skal gjøres flere ganger i et program er det en god regel å generalisere det til en funksjon.

 

System.out.println(findChar("A",tabell));
System.out.println(findChar("B",tabell));
System.out.println(findChar("C",tabell));
System.out.println(findChar("D",tabell));
System.out.println(findChar("E",tabell));
System.out.println(findChar("F",tabell));
System.out.println(findChar("G",tabell));

private int findChar(String character, table tabell)
{
int output = Arrays.binarySearch(tabell, character);
return output;
}

 

Eventuelt kan du jo kjøre output i funksjonen også, men da blir den litt ubrukelig til generell bruk :)

 


findChar("A",tabell);
findChar("B",tabell);
findChar("C",tabell);
findChar("D",tabell);
findChar("E",tabell);
findChar("F",tabell);
findChar("G",tabell);

private void findChar(String character, table tabell)
{
int output = Arrays.binarySearch(tabell, character);
System.out.println(output);
}

 

Jeg ville også renset opp litt i mainmetoden:

 



public static void main(String[] args) {
char[] tabell=new char[7000];
char[] bokstaver={'A', 'B', 'C', 'D', 'E', 'F', 'G'};

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

fix= (int)(Math.random()*7);

tabell[i] = bokstaver[fix];
}

Sikkert masse syntaksfeil her, over ti år siden sist jeg kodet java :)

Endret av kvasbo
Lenke til kommentar

En lite tips jeg kan komme med er at du ikke trenger å bruke mange variabler i en slik utregning. Du kan gjerne bruke kun 1 og overskrive den samme, eller bare ta enkel utregning i en linje.

 

F.eks. kan du skrive om:

double fix;
double fix2;
int fix3;
fix=Math.random();
fix2=fix*7;
fix3=(int)fix2;

til noe så enkelt som:

int tall;
tall = int(Math.random()*8);

Koden blir da mye lettere å lese.

Endret av etse
Lenke til kommentar

har et spørsmål angående neste del av oppgaven (oppgave B) da skal man søke etter første gang i den sorterte tabellen vi får se B, også C osv.

har funnet 2 alternative løsninger på det, ingen fungerer :( (får feil i koden, vet ikke hva jeg gjør feil)

int indexOf(int ch) var den første metoden

 

 

String tabell2=new String(tabell);

int indexOf(tabell2 'A');

forsøkte å gjør tabellen om til string etter den var sortert for så å lete etter første gang A kom frem, dette fungerte ikke i det hele tatt ettersom, ser jo at jeg fyller inn feil men nettsiden som ga meg den ga veldig lite mening :\

http://www.tutorialspoint.com/java/java_string_indexof.htm

 

 

har noen en grei metode å lete i denne tabellen min UTEN å lage en haug med index variabler, står nemlig i oppgaven at man skal lage søkingen så "Lettvint" som mulig og....

? :\

Lenke til kommentar

hva med en egen metode som gjør det for deg med en enkel while-løkke?

 

noa ala

public static int indeksTilForste(char c) {
int i = 0;
while(bokstaver[i] != c){
i++;
}
return i;
}

 

Du får selv finne en måte å håndtere problemet som oppstår dersom c ikke eksisterer ;)

Da vil forsåvidt løkken bli uendelig, så kanskje det er bedre med en for-løkke isteden.

 

bokstaver[] er forresten ikke en feltvariabeli koden din foreløpig, så enten må du deklarere den utenfor main-metoden, eller så må du gi den som parameter til søkemetoden, hvis du vil bruke en egen metode til dette.

Endret av srbz
Lenke til kommentar

Skrev et forslag til hele kildekoden basert på det du selv har gjort:

 

package minePrograms;
import java.util.*;

public class oppgave7a {
private static char[] tabell=new char[7000];
private static char[] bokstaver={'A', 'B', 'C', 'D', 'E', 'F', 'G'};

public static void main(String[] args) {

	for (int i = 0; i < tabell.length; i++) {
		tabell[i] = bokstaver[(int) (Math.random()*7)];
	}

	Arrays.sort(tabell);

	for (int i = 0; i < bokstaver.length; i++){
		System.out.println("Indeks til tilfeldig '" + bokstaver[i] + "': " + Arrays.binarySearch(tabell, bokstaver[i]));
	}

	for (int i = 0; i < bokstaver.length; i++){
		int temp = indexToFirstEntry(bokstaver[i]);
		if(temp >= 0)
			System.out.println("Indeks til første '" + bokstaver[i] + "': " + temp);
		else
			System.out.println("'" + bokstaver[i] + "' finnes ikke!");
	}
}

public static int indexToFirstEntry(char c){

	for (int i = 0; i < tabell.length; i++){
		if (tabell[i] == c)
			return i;
	}

	return -1;
}
} 

 

MEN! Arrays.binarySearch(char[] a, char key) krever at tabellen er sortert på forhånd. Jeg fikk endel negative verdier ved kjøring. Jeg forsøkte å gjøre tabell[] om til en ArrayList<Character>, men metoden godtar bare tabeller av typen char[].

 

Med mindre noen kjenner til kjappe løsninger for å sortere en char[]-tabell må du nesten implementere en sorteringsalgoritme for å kunne bruke denne metoden. Eller så kan du lage en for-løkke som teller gjennom hele tabellen, det er vel kanskje det greieste :)

 

Meh, du hadde jo en Arrays.sort() der, må ha vært litt rask på avtrekkeren med å fjerne den.

 

Lurer forøvrig litt på hvordan Arrays.binarySearch() funker. Jeg får samme verdier for disse tallene ved hver kjøring, enda tabellen genereres tilfeldig.

Endret av srbz
Lenke til kommentar

hva med en egen metode som gjør det for deg med en enkel while-løkke?

 

noa ala

public static int indeksTilForste(char c) {
int i = 0;
while(bokstaver[i] != c){
i++;
}
return i;
}

 

Du får selv finne en måte å håndtere problemet som oppstår dersom c ikke eksisterer ;)

Da vil forsåvidt løkken bli uendelig, så kanskje det er bedre med en for-løkke isteden.

 

bokstaver[] er forresten ikke en feltvariabeli koden din foreløpig, så enten må du deklarere den utenfor main-metoden, eller så må du gi den som parameter til søkemetoden, hvis du vil bruke en egen metode til dette.

 

Dette er en grusomt ineffektiv metode for å søke i en sortert liste. Om man skal lage dette manuelt ville jeg heller kjørt en "splitt og sjekk"-algoritme som starter i midten og ser om den er over eller under (eller på, som blir samme som over) rett bokstav, for så å dele arrayet på to igjen og gjenta prosedyren.

 

Generelt er imidlertid de innebyggede søkemetodene i språk veien å gå for normale søk - de er stort sett meget gode.

 

 

Lenke til kommentar

sånn, tusen takk for all hjelpen bare del C igjen nå :)

forøvrig løste jeg oppgave B ved den løkka du gav meg, tusen tusen takk :)

 

her er løsningen min om noen skulle være intereserte /ha samme oppgave i fremtiden:

 

package minePrograms;

import java.util.*;

 

public class oppgave7b {

 

 

public static void main(String[] args) {

char[] tabell=new char[7000];

char[] bokstaver={'A', 'B', 'C', 'D', 'E', 'F', 'G'};

double fix;

double fix2;

int fix3;

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

fix=Math.random();

fix2=fix*7;

fix3=(int)fix2;

tabell = bokstaver[fix3];

}

 

Arrays.sort(tabell);

String tabell2=new String(tabell);

int iB=0;

int iC=0;

int iD=0;

int iE=0;

int iF=0;

int iG=0;

while(tabell[iB]!= 'B'&&tabell[iB]<7001){

iB=iB+1;

}

while(tabell[iC]!= 'C'&&tabell[iB]<7001){

iC=iC+1;

}

while(tabell[iD]!= 'D'&&tabell[iB]<7001){

iD=iD+1;

}

while(tabell[iE]!= 'E'&&tabell[iB]<7001){

iE=iE+1;

}

while(tabell[iF]!= 'F'&&tabell[iB]<7001){

iF=iF+1;

}

while(tabell[iG]!= 'G'&&tabell[iB]<7001){

iG=iG+1;

}

System.out.println(iB);

System.out.println(iC);

System.out.println(iD);

System.out.println(iE);

System.out.println(iF);

System.out.println(iG);

}

 

 

 

}

Endret av Gnurk(homesmasher)
Lenke til kommentar

beklager for alt maset(er ikke særlig individualistisk tydeligvis)

men siste oppgave er

 

 

Lag et program som lar brukeren taste inn flere ord etter hverandre med mellomrom imellom.

Ordene skal så skrives ut igjen på skjermen i leksikografisk orden. Brukeren skal få prøve

flere ganger, helt til han/ hun ikke vil mer.

Eks. på programutførelse:

Tast inn flere ord: alle fugler små de er kommer nå tilbake

Sortert: alle de er fugler kommer nå små tilbake

 

 

og jeg lurer bare på en ting:

hvordan kan jeg se på ord for ord i et string? kan jo gjør string om til et Array og se på bokstav for bokstav, men ord for ord blir jo litt vanskeligere?

 

 

finnes det et "metode" som gjør dette for deg? :p

 

edit: innser at jeg må bruke array og slå sammen når man kommer til " ", men fortsatt er det en pre-defined method for dette som kan importes?

Endret av Gnurk(homesmasher)
Lenke til kommentar

Du kan bruke String.split() for å dele en tekststreng. Du kan da angi at tekststrengen skal deles der hvor mellomrommene er. Resultatet blir en array hvor hvert element er ett ord fra setningen.

 

Ta en titt i Java API-doc'en, så finner du nok ut av det.

Endret av geir_a
Lenke til kommentar

tror jeg har løsninga nå ja, tusen takk, brukte split før bare glemte å sette et mellom ledd array :)

 

blir noe slik tenker jeg, alt jeg må finne ut er den if testen og hvordan jeg sammenligneri med at det er siste ledd i tabell så er jeg i land :9

 

String input=A.next();

String[] tabell=input.split(" ");

int i=0;

boolean check=false;

while(check=false){

System.out.print(tabell);

i++;

if(i==tabell){

check=true;

}

}

Lenke til kommentar

den .split fungerer foresten dårlig, jeg testet bare med å gjør:

Scanner A=new Scanner(System.in);

String input=A.next();

String[] tabell=input.split(" ");

 

Arrays.sort(tabell);

int i=0;

System.out.print(tabell);

boolean check=false;

 

 

og når jeg skriver f.eks "hei pei jeg meg" så får jeg utskriften: "[Ljava.lang.String;@1a758cb"

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å
×
×
  • Opprett ny...