Gå til innhold

[Løst] Javaoppgaver - Tekstanalyse


Anbefalte innlegg

Hei, jeg sitter fast igjen med en oppgave, en meget kompleks en sådan. Jeg lurer på om noen kunne hjulpet meg med koden i denne (trenger ikke nødvendigvis klient), er helt blank pr nå.

 

Oppgave

I denne oppgaven skal du lage en klasse for tekstanalyse. Teksten er et objekt av klassen String, og du får tak i tegnet på en bestemt posisjon ved å bruke metoden charAt(). Lengden av teksten er gitt ved metoden length(). Følgende kodebit illustrerer bruken av metodene charAt() og length() og gir også tips om hvordan resten av oppgavene kan løeses (a-z og A-Z ligger etter hverandre i Unicode-tegnsettet):

 

for (int i = 0; i < tekst.length(); i++) { //Posisjonene nummereres fra 0 og oppover
char tegn = tekst.charAt(i);
int verdi = tegn; //Omforming fra Char til Int
System.out.println("Unicode-verdien til tegnet " + tegn + " på posisjon " + i + " er" + verdi);
}

 

Som objektvariabel i klassen Tekstanalyse skal du ha en tabell av int:

 

int[] antallTegn = new int[30];

 

I denne tabellen gjelder at indeks 0-28 inneholder antall forekomster i en tekst av bokstavene a-å, mens indeks 29 inneholder antall forekomster av alle andre tegn enn bokstaver, for eksempel mellomrom, komma og punktum. Vi skiller ikke mellom store og små utgaver av en bokstav.

Konstruktøren skal ta den aktuelle teksten som argument og fylle opp tabellen antallTegn med antall tegn av hver type.

Etter at tabellen antallTegn er fylt opp, skal en klient kunne få utført følgende tjenester:

  • Finn antall forskjellige bokstaver i teksten. Her ser vi altså bort fra alle andre tegn enn bokstaver.
  • Finn totalt antall bokstaver i teksten.
  • Hvor stor del av teksten (prosent) er ikke bokstaver?
  • Finn antall forekomster av en bestemt bokstav. Bokstaven skal være parameter til metoden.
  • Hvilken - eller hvilke, om det er flere som forekommer like ofte - bokstaver forekommer oftest i teksten?

Lag et klientprogram som går i løkke. I hvert løkkegjennomløp skal klienten skrive inn en tekst, og resultatet av alle analysene foran skal skrives ut.

 

På forhånd takk!

Lenke til kommentar
Videoannonse
Annonse

Hva har du prøvd selv? Kommer ikke til å gjøre oppgaven for deg, men kan prøve og gi deg et lite hint.

 

Du får et hint om at a-z ligger etter hverandre i verdi i oppgaveteksten. Du vet at 'a' gir en int, men du bør prøve å få den inten til å være 0-28. Det kan du gjøre ved å ta 'a' - 'a' som blir 0, 'b' - 'a' blir 1 osv.

Så kan du øke den posisjonen i antallTegn[] med 1, altså antallTegn[tegn - 'a'].

 

Dette er ikke alt du trenger, men litt på vei.

  • Liker 1
Lenke til kommentar

Takk for tips. Holder på med den nå og sålangt er dette det jeg har kommet opp med:

import static javax.swing.JOptionPane.*;
class Tekstanalyse1 {
private String[] tekst = new String[28];
private int[] antallTegn = new int[30];
public Tekstanalyse1(String[] tekst, int[] antallTegn) {
 this.tekst = tekst;
 this.antallTegn = antallTegn;
}
public void antallFb() {
}

}

 

Jeg tror at tankegangen er rett med å lage en metode for hver operasjon men har foreløpig ikke funnet noen god løsning på konstruktør mm.

Lenke til kommentar

Dette er ikke en grusomt vanskelig oppgave hvis man bare tar det ett skritt av gangen. Det eneste du trenger å tenke på i første omgang er å fylle opp antallTegn[] korrekt. Fremgangsmåten blir ikke noe verre enn å gå igjennom hvert tegn i strengen, og bruke tegnet i hver posisjon som en addresse til en plass i antallTegn[](dette har du allerede fått hint om hvordan gjøres).

Endret av SkoMedHull
  • Liker 1
Lenke til kommentar

Her er en måte å gjøre det på (har brukt standard inn/ut her, må endre litt hvis du skal ha grafisk brukergrensesnitt).

 

public class StringAnalyzer {

   private final static String alphabetStr = "abcdefghijklmnopqrstuvwxyzæøå";
   private final static char[] alphabet = alphabetStr.toCharArray();

   /**
    * Returns the index of <code>c</code> if one of the characters in
    * <code>alphabet</code>. If not, <code>alphabet.length</code> is
    * returned.
    *  
    * @param c  character to get index for
    * 
    * @return index of character if it's found in <code>alphabet</code>
    */
   private static int charIndex(char c) {
       if (c >= 'a' && c <= 'z') {
           return c - 'a';
       }
       if (c >= 'A' && c <= 'Z') {
           return c - 'A';
       }
       switch(c) {
       case 'æ': case 'Æ': return 'z' - 'a' + 1;
       case 'ø': case 'Ø': return 'z' - 'a' + 2;
       case 'å': case 'Å': return 'z' - 'a' + 3;
       default:  return alphabet.length;
       }
   }

   /**
    * Returns an int-array of size <code>alphabet.length + 1</code>, which
    * contains the number of characters in <code>text</code> equal to the
    * character in <code>alphabet</code> with the same index. The last entry
    * in the int-array contains the number of characters in <code>text</code>
    * which is not found in <code>alphabet</code>.
    * 
    * @param text  the text used when counting characters
    * 
    * @return an int-array with the number of different characters in
    * <code>text</code>
    */
   private static int[] charCount(String text) {
       int[] result = new int[alphabet.length+1];
       for (char c : text.toCharArray()) {
           result[charIndex(c)]++;
       }
       return result;
   }

   /**
    * Gathers some statistics from an int-array with number of characters of
    * different types and print them to standard out. The int-array must
    * be of size <code>alphabet.length + 1</code>.
    * 
    * @param charCount     int-array to use for statistics
    * @param chosenLetter  a chosen letter for some additional statistics
    */
   private static void printStatistics(int[] charCount, char chosenLetter) {
       // number of unique letters in the text
       int noOfUniqueLetters = 0;
       // total number of letters in the text
       int totalNoOfLetters = 0;
       // list of letters that are most used
       char[] maxCountChars = new char[alphabet.length];
       // number of elements in maxCountChars
       int maxCountCharsNo = 0;
       // how often the letter(s) in maxCountChars are used
       int maxCount = 0;

       // loop through the charCount array to set
       // noOfUniqueLetters, totalNoOfLetters and
       // maxCount/maxCountChars/maxCountCharsNo
       for (int i = 0; i < charCount.length-1; i++) {
           if (charCount[i] > 0) {
               noOfUniqueLetters++;
               totalNoOfLetters += charCount[i];
               if (charCount[i] > maxCount) {
                   // found letter which are more often used than
                   // current letter(s) in maxCountChars, set
                   // maxCount and reset maxCountChars
                   maxCount = charCount[i];
                   maxCountCharsNo = 0;
               }
               if (charCount[i] == maxCount) {
                   // letter is most-often-used, add to maxCountChars
                   maxCountChars[maxCountCharsNo++] = alphabet[i];
               }
           }
       }
       int totalNoOfChars = totalNoOfLetters + charCount[charCount.length-1];
       // amount of non-letter characters
       double otherCharsAmount = (double)
               (1000 * charCount[charCount.length-1] / totalNoOfChars)
               / 10.0;
       // count of a specific letter
       int noOfChosenLetter = charCount[charIndex(chosenLetter)];

       // print statistics
       System.out.println("Number of unique letters: " + noOfUniqueLetters);
       System.out.println("Total number of letters: " + totalNoOfLetters);
       System.out.println(
               "Amount of non-letters: " + otherCharsAmount + " %");
       if (charIndex(chosenLetter) == alphabet.length) {
           System.out.println("There are " + noOfChosenLetter
                   + " non-letters in the text");
       } else {
           System.out.println("The letter '"
                   + alphabet[charIndex(chosenLetter)]
                   + "' is used " + noOfChosenLetter + " times");
       }
       System.out.print(
               "Most used letter(s) (used " + maxCount + " times): ");
       for (int i = 0; i < maxCountCharsNo; i++) {
           System.out.print(maxCountChars[i] + " ");
       }
       System.out.println();
   }

   /**
    * Enters an inifinite loop for the user to enter text, and then prints
    * statistics about this text. Terminates when the user presses RETURN
    * without entering any text.
    * 
    * @param args  command-line arguments, these are ignored
    */
   public static void main(String[] args) {
       String line;
       String selectedChar;
       java.util.Scanner scan = new java.util.Scanner(System.in);
       while (true) {
           System.out.print("\nWrite some text: ");
           line = scan.nextLine();
           if (line.length() == 0) break;
           System.out.print("Enter a letter: ");
           do {
               selectedChar = scan.nextLine().trim();
               if (selectedChar.length() == 1) {
                   break;
               } else {
                   System.out.print(
                           "Invalid input, please enter a single letter: ");
               }
           } while (true);
           System.out.println();
           int[] charcnt = charCount(line);
           printStatistics(charcnt, selectedChar.charAt(0));
       }
       System.out.println("\nGoodbye!");
   }

}

Endret av jonny
  • Liker 1
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...