Gå til innhold

PriorityQueue for en setning med ord


Anbefalte innlegg

Hallo

 

Har fått følgende oppgave:

 

Lag en ordbok

Når brukeren skriver inn en setning, skal programmet lagre de individuelle ordene som en PriorityQueue. Når ti ord er lagret i køen skal ordene bli skrevet ut alfabetisk.

 

Hvordan løses denne oppgaven best? Skal jeg kunne skrive inn en setning på f.eks. 25 ord, og når jeg trykker på enter så skal den sortere de 10 første ordene for seg, så de ti neste ordene, for så å vente på at det kommer 5 nye ord?

 

Eller kan jeg gå ut ifra at jeg kan lage en setning på nøyaktig 10 ord, for så å trykke enter?

 

Det jeg har fått til til nå er å skrive inn 10 individuelle ord, der jeg trykker på enter mellom hvert ord. Hva bør jeg få til videre? Hva kan evt. forbedres?

 

Takk for svar :)

 

import java.util.Scanner;
import java.util.PriorityQueue;
public class FirstClass
{
   public static void main( String[] args )
   {
 System.out.println( "****Create a dictionary****" );
 //Queue of capacity 10
 PriorityQueue< String > queue = new PriorityQueue< String >();

 // insert elements to Queue
 System.out.print( "Please insert a sentence of ten words. Seperate each word with enter:");
 for(int i = 0; i<10; i++)
 {
  Scanner sentence = new Scanner( System.in );
  String sentenceText = sentence.nextLine();
  queue.offer( sentenceText );
 }

 System.out.print( "Polling from queue: " );

 // Display elements in queue
 while ( queue.size() > 0 )
 {
  System.out.printf( "%s ", queue.peek() ); //view top element
  queue.poll(); // remove top element
 } // end while
   } // end main
} // end class FirstClass

Lenke til kommentar
Videoannonse
Annonse

Jeg er bare ikke helt tilfreds med å klikke "Enter" for hvert ord, når oppgaven ber meg om å skrive inn en setning.

 

Edit: og heller ikke det at setningen jeg skriver inn må være på nøyaktig 10 ord.

Eller virker det greit?

Endret av r2d290 waits for Obi-Wan
Lenke til kommentar

Du kan naturlig nok bruke String.split(" ") for å ta én linje og splitte den opp i enkeltord. Deretter kan du flytte alle disse ordene over i køen én etter én. Mellom hvert element som blir lagt til så sjekker du om du har 10 elementer, hvis du har det så skriver du ut alle ordene fra køen.

Lenke til kommentar

Om det er skoleoppgave skal dere nok levere noe dokumentasjon sammen med koden? Skriv i så fall innledningsvis alle antagelser dere gjør der. Da er det lett for de som ser over koden å vite hvorfor dere har gjort noe, om det ikke helt hva det han hadde tenkt. Og om antagelsene dine er fair, så burde det ikke gi noe trekk selv om det var litt feil måte. Han vil selv forstå at oppgaveteksten var litt uklar.

 

Da kan du skrive noe som "Oppgave teksten var noe uklar, men slik vi tolket den skulle brukeren skrive inn hele setninger inn i programmet på en linje. Dette gjør at vi selv må dele setningen opp i ulike ord..."

 

Vil og anbefale at dere fjerner eventuelle spesialtegn siden det skal være ord om det vil være fint. Altså ting som komma, punktum og utropstegn. Da det er naturlig å forvente at setninger avsluttes med dette.

Lenke til kommentar

Jeg laget et utkast til hvordan jeg ville løst det. Det jeg dog ikke har gjort er å fjerne spesialtegn, og det finnes ikke noen god måte å avslutte programmet. Her ser du i alle fall hvordan det går an å gjøre det med tanke på å legge til elementer i køen og printe ut når det er 10 elementer.

 

http://pastebin.com/R4dhitKa

 

Mvh Håkon.

 

Bare påpeke en mulig liten feil i koden din, i tilfelle andre tar denne ibruk:

               for(String word : words)
               {
                       if(queue.size()>=10)
                               printTenElements();
                       queue.offer(word);
               }

 

Her bør vel queue.offer(word) komme før if-setningen? Hvis ikke, printer den ikke ut de ti elementene før det har blitt skrevet inn elleve elementer.

Lenke til kommentar

Lurer på en liten ting til.

Koden i boka mi: Java how to program, eight edition, Paul Deitel & Harvey Deitel, side 867:

 

 

 

import java.util.PriorityQueue;
public class PriorityQueueTest
{
public static void main( String[] args )
{
	//queue of capacity 11
	PriorityQueue< Double > queue = new PriorityQueue< Double>();

	//insert elements to queue
	queue.offer(3.2);
	queue.offer(9.8);
	queue.offer( 5.4);

	System.out.print( "Polling from queue: " );

	// display elements in jueue
	while ( queue.size() > 0 )
	{
		System.out.printf( "%.1f", queue.peek() );
		queue.poll(); //remove top element
	}
}
}

 

 

 

Jeg skjønner ikke hvorfor de skriver kommentaren "Queue of capacity 11". Hvor får de 11 fra?

I teksten står det: "Line 10 creates a priorityqueue that stores Doubles with an initial capacity of 11 elements and orders the elements..."

Lenke til kommentar

Jeg skjønner ikke hvorfor de skriver kommentaren "Queue of capacity 11". Hvor får de 11 fra?

I teksten står det: "Line 10 creates a priorityqueue that stores Doubles with an initial capacity of 11 elements and orders the elements..."

 

Betyr vel akkurat det som står der, klassen PriorityQueue er hardkodet til å ha en kapasitet på 11 om du ikke har angitt noe annet i konstruktør.

 

ALLTID LES API OM NOE SKURRER PÅ EN KLASSE DU IKKE HAR PROGRAMMERT SELV.

http://docs.oracle.c...PriorityQueue()

 

Jeg regner med at de har gått for tallet 11 fordi det var ett like bra tall som noe annet.

 

Les dette, virket som en rimelig grei forklaring på hvordan PriorityQueue er lagt opp http://www.cs.cmu.ed.../15-priorqs.pdf

 

For å forklare i korte trekk så er PriorityQueue en Heap med 11 noder ferdig lagt opp som du kan sette inn tall i, setter du inn mer en 11 tall så må du belaste CPU med flere operasjoner for å lage splitter nye heaps hvor alle tallene blir satt inn helt på nytt i for hvert tall du legger inn.

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