Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  18 2015
litt missvisende tittel. Uansett:

Om jeg oppretter en streng, f.eks:

Kode

 String test = new String ("test");
Er det mulig å sende verdi i form av f.eks, bokstavene: x x x x x, deretter lese antall av bokstavene x i strengen og skrive ut antall (antall x: 5)? Såfall hvordan ?

Kode

System.out.printf(test);
Mulig jeg er litt sliten nå, men jeg ser ikke helt hva du vil frem til.
Du kan lage en for-løkke som søker igjennom en string etter en aktuell bokstav, hvis det er det du mener? Isåfall kan du bare søke gjennom stringen mens du teller opp antall "x"-er.

Ønsker du lengden på en string kan du jo bare bruke String.length
Sist endret av Restyle; 16. september 2010 kl. 21:46.
Innestengt
Spelly's Avatar
Trådstarter
Ok elendig formulering, beklager det.

Det programmet skal gjøre er:
La bruker skrive inn ulike verdier, f.eks: æøå.
Eksempel på kjøring tenker jeg er slik, brker skal kunne skrive inn 3 verdier på hver linje, ønsker bruker å skrive inn fler, trykk enter.

input:
Verdi: æåæ
verdi: øøæ
Verdi: ååå

output:
antall æ:3
antall ø: 2
antall å: 4
hva kan jeg gjøre for at programmet skal kunne lese verdiene brukeren har skrevet og skrive ut antall av de ulike verdiene i output?
Eksempel: Hvis du vil ha alle x-ene i en string.

Kode

int teller = 0;
for(int i = 0; i < somestring.length; i++) {
if(somestring.charAt(i).equals("X")) teller++;
}
system.out.println("X: " + teller);
}
Du kan med fordel legge til en toUpperCase også, så teller den med store og små bokstaver.
Sist endret av Restyle; 16. september 2010 kl. 21:55.
Innestengt
Spelly's Avatar
Trådstarter
Får prøve dette, tusen takk for hjelp!
Vent, det funker selvsagt ikke. Du kan ikke bruke equals på charAt. Det er en primitiv datatype.

To alternativer:

Kode

public class test {
	public static void main(String[] args) {
		String somestring = "xxXXaaaaaX";
		int teller = 0;
		for(int i = 0; i < somestring.length(); i++) {
		if(somestring.toUpperCase().charAt(i) == 'X') teller++;
		}
		System.out.println("X: " + teller);
	}
}
eller med substring:

Kode

import java.util.Scanner;
public class test {
	public static void main(String[] args) {		
		Scanner in = new Scanner(System.in);
		System.out.print("Verdi: ");
		String input = in.nextLine();
		
		int teller = 0;
		for(int i = 0; i < input.length(); i++) {
			if(input.substring(i, (i + 1)).toUpperCase().equals("X")) teller++;
		}
		System.out.println("X: " + teller);
	}
}
Det ble ikke helt pent det her men, du ser vel tegninga. Kanskje finnes det en lettere måte, men jeg kan ikke si jeg vet om noen.
Sist endret av Restyle; 16. september 2010 kl. 22:09.
Hvis man vil gjøre den mer universell, kan man gjøre noe slik:

Kode

import java.util.Scanner;

public class Test
{
    public static void main(String[] args)
    {        
        Scanner in = new Scanner(System.in);
        System.out.print("Streng: ");
        String input = in.nextLine().toLowerCase();

        char[] cArray = input.toCharArray();

        char[] c = {'a','b','c','d','e','f','g','h','i',
                    'j','k','l','m','n','o','p','q','r',
                    's','t','u','v','w','x','y','z','æ',
                    'ø','å'};
    
        int[] frekvens = new int[29];
        
        for (int i = 0; i < cArray.length; i++)
            {
                for (int j = 0; j < c.length; j++)
                    {
                        if (cArray[i] == c[j])
                            frekvens[j]++;
                    }
            }

        for (int i = 0; i < c.length; i++)
            {
                System.out.printf("%c: %d\n", c[i], frekvens[i]);
            }
    }
}
Sist endret av raze; 16. september 2010 kl. 23:09.
Det er klart, det er mye man kan forbedre. Viste bare et enkel prinsipp på hvordan det kan løses. Utvidelsen antok jeg at han klarer å se for seg selv, etter forslaget til hvordan det kan løses er lagt frem
Har dere ikke filter eller where (som funker på strenger) i Java? Mye mere elegant...

Et lite (sikkert uforståelig) eksempel i Clojure:

Kode

(defn count-char [x coll]
      (count (filter #(= x %) coll)))

(println "Antall g'er i strenger er"
         (count-char \g "god middag"))

; -> Antall g'er i strenger er 2
Innestengt
Spelly's Avatar
Trådstarter
Takker for all hjelp.

Er det forøvrig en enklere måte å dekalere følgende variabler(?): (tenker da på int teler 1,2 og 3. Syntes det ble litt rotete)

Kode

 
 int teller3= 0;
  int teller2 = 0;
  int teller = 0;
  
  for(int i = 0; i < input.length(); i++) {
   if(input.substring(i, (i + 1)).toUpperCase().equals("Æ")) teller++;
      if(input.substring(i, (i + 1)).toUpperCase().equals("Ø")) teller2++;
      if(input.substring(i, (i + 1)).toUpperCase().equals("Å")) teller2++;

  }
  System.out.println("X: " + teller);
  System.out.println("Æ: " + teller2);
  System.out.println("Å: " + teller3);
 }
På System.out.println, er det bedre å opprette en string og referere til den med printf?
Eller er det greit å gjøre det slik jeg har gjort de T?
Sist endret av Spelly; 17. september 2010 kl. 10:47.
Sitat av spelley Vis innlegg
Takker for all hjelp.

Er det forøvrig en enklere måte å dekalere følgende variabler(?): (tenker da på int teler 1,2 og 3. Syntes det ble litt rotete)

Kode

 
 int teller3= 0;
  int teller2 = 0;
  int teller = 0;
  
  for(int i = 0; i < input.length(); i++) {
   if(input.substring(i, (i + 1)).toUpperCase().equals("Æ")) teller++;
      if(input.substring(i, (i + 1)).toUpperCase().equals("Ø")) teller2++;
      if(input.substring(i, (i + 1)).toUpperCase().equals("Å")) teller2++;

  }
  System.out.println("X: " + teller);
  System.out.println("Æ: " + teller2);
  System.out.println("Å: " + teller3);
 }
På System.out.println, er det bedre å opprette en string og referere til den med printf?
Eller er det greit å gjøre det slik jeg har gjort de T?
Vis hele sitatet...
Enklere blir det ikke nei Klart, skal du bare sjekke bokstavene æ, ø og å, er det ikke noe stress. Men prøv det med alle 29 bokstavene.

Programmering handler jo om å simplifisere operasjoner.
Et annet eksempel til koden du postet:

Kode

public class Test {
	public static void main(String[] args) {
		String input = "xxææxxååxxøøxxæxøxå"; 
		
		input = input.toUpperCase();
		char[] charArray = {'Æ', 'Ø', 'Å'};
		int[] counterArray = {0, 0, 0};
		
		for(int i = 0; i < input.length(); i++) {
			for(int j = 0; j < charArray.length; j++) {
				if(input.charAt(i) == charArray[j]) counterArray[j]++;
			}
		}
		for(int i = 0; i < charArray.length; i++) {
			System.out.printf("%s: %d\n", charArray[i], counterArray[i]);
		}
	}
}
Anngående deklarasjonene av telleren kan det deklareres slik også:

Kode

int teller1 = 0, teller2 = 0, teller3 = 0;
int[] counterArray = {0, 0, 0};

og

int[] counterArray = new int[3];

er ekvivalente. Alle heltallstabeller blir av kompilatoren satt til 0.

Så til ditt spørsmål. Ja, selvfølgelig kan du det. Men hvorfor? Skal du ha 29 tellevariabler? Hvorfor finnes tabeller da?
Innestengt
Spelly's Avatar
Trådstarter
Sjekket litt på koden din raze, likte den. Er ikke komt helt inn på array enda, men skal helt klart leke litt med koden, lett å lære seg da. Takker, raze!

Uansett, jeg har et siste spørsmål.
er det mulig å gjenta koden som står helt i bunnen av dette innlegget, (uten å lage beregninger)til en bruker skriver en tom linje (da kommer beregningene)?

Kjøring er f.eks slik:
String: ååååææææøøøø (enter)
String: ææææø (enter)
String: æææ (enter)
String: (enter)
å: 4
æ: 11
ø: 5

Kode

    for(int i = 0; i < input.length(); i++) 
      
{
      
      if(input.substring(i, (i + 1)).toUpperCase().equals("X")) teller++; //Test
 System.out.println("x: " + teller3);
  }
Jeg prøvde med repreat i

Kode

 for(int i = 0; i < input.length(); i++)
for å loope koden uendelig, men dette fungerte ikke.
Sist endret av Spelly; 18. september 2010 kl. 01:03.
Enkel, men ufin:

Kode

import java.util.*;

public class Test
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        System.out.print("Streng: ");
        String s = in.nextLine();

        while (s.length() != 0)
            {
                System.out.print("Streng: ");
                s = in.nextLine();
            }
    }
}
Innestengt
Spelly's Avatar
Trådstarter
Takker!
Det fungerte ok, men som du sier: ufint.
den leser ikke alle bokstavene + den printer ut resultat instant.

kunne tenkt meg at resultatene ble skrevet inn helt på slutten, etter bruker hadde tastet inn ønskede verdier, slik jeg nevnte tidligere.
Er det en enkel kodesnutt jeg kan skrive for å få dette fikset, hvis jeg må starte helt på nytt igjen er det ikke noe poeng i det.
String: ååååææææøøøø (enter)
String: ææææø (enter)
String: æææ (enter)
String: (enter)
å: 4
æ: 11
ø: 5
I og med at du ikke paster koden du har akkurat nå gjør du det ikke lett å svare på akkurat det.

Hva med noe slikt?

Kode

public class CountChars {
	public static void main(String[] args) {
		TreeMap<Character, Integer> charCount = new TreeMap<Character, Integer>();
		Scanner input = new Scanner(System.in);
		
		while(true) {
			// Prompt for sentences
			System.out.print("String: ");
			// Get input
			String line = input.nextLine().toLowerCase();
			// Validate - break out of the input loop
			if(line.length() == 0)
				break;
			// Iterate over the characters in the line entered
			for(char c : line.toCharArray()) {
				// Add the character to the hashmap
				charCount.put(c,  charCount.get(c) != null ? charCount.get(c) + 1 : 1);
			}
		}
		// Display statistics
		for(Character c : charCount.keySet()) {
			System.out.println(c.charValue() + ": " + charCount.get(c));
		}
	}
}
Output:

Kode

String: java
String: er
String: gøy
String: 
a: 2
e: 1
g: 1
j: 1
r: 1
v: 1
y: 1
ø: 1
Om det blir for avansert med bruk av foreach og Maps har jeg lagt til et forslag som bruker et endimensjonalt array og tradisjonelle for-loops.

Kode

public class CountCharsArray {
	public static void main(String[] args) {
		int[] charCount = new int[255];
		Scanner input = new Scanner(System.in);
		
		while(true) {
			// Prompt for input
			System.out.print("String: ");
			// Get input, convert to lowercase and remove whitespaces
			String line = input.nextLine().toLowerCase().replaceAll(" ", "");
			// Validate
			if(line.length() == 0)
				break;
			// Loop through the characters in the line
			for(int i = 0; i < line.length(); i++) {
				charCount[(int)line.charAt(i)]++;
			}
		}
		// Display statistics
		for(int i = 0; i < charCount.length; i++) {
			// Skip character counters that are still set to 0
			if(charCount[i] == 0)
				continue;
			System.out.println((char)i + ": " + charCount[i]);
		}
	}
}
Sist endret av John B; 18. september 2010 kl. 03:01.
Innestengt
Spelly's Avatar
Trådstarter
Takker raze begge kildekodene får feilmeldinger.
uansett, her er koden:

Kode

import java.util.Scanner;

public class test {
  public static void main (String[]args) {
    
    Scanner tastatur = new Scanner(System.in);
    
    System.out.println("Skriv en statusstreng  per linje. \n Innlesing avsluttes med tom linje.\n");
    String angi = "Angi statusstreng (åæø):"; //statusstreng
    
    
    System.out.print(angi);
    String input = tastatur.nextLine();
    
    int teller = 0, teller2 = 0, teller3 = 0;
 
    
    
    for(int i = 0; i < input.length(); i++) 
{
      
      if(input.substring(i, (i + 1)).toUpperCase().equals("å")) teller++; // godkjent
      if(input.substring(i, (i + 1)).toUpperCase().equals("æ")) teller2++; // ikke godkjent
      if(input.substring(i, (i + 1)).toUpperCase().equals("ø")) teller3++; // ikke levert
      
    }//skriver ut resultat
    System.out.println("å: " + teller); 
    System.out.println("æ: " + teller2);
    System.out.println("ø: " + teller3);
  } 
}
Fant feilen, du hadde glemt å inporte java.util.scanner.

Ignorer den første koden jeg pastet, se denne i stedet:

Kode

import java.util.Scanner;

public class test {
  public static void main (String[]args) {
    
    Scanner tastatur = new Scanner(System.in);
    
    System.out.println("Skriv en statusstreng  per linje. \n Innlesing avsluttes med tom linje.\n");
    String angi = "Angi statusstreng (å, æ, ø):"; //statusstreng
    
    System.out.print(angi);
    String input = tastatur.nextLine();
    int teller = 0, teller2 = 0, teller3 = 0;
    
    While(true){    
    for(int i = 0; i < input.length(); i++)   
      if(input.substring(i, (i + 1)).toUpperCase().equals("æ")) teller++; //æ 
      if(input.substring(i, (i + 1)).toUpperCase().equals("ø")) teller2++; // ø
      if(input.substring(i, (i + 1)).toUpperCase().equals("å")) teller3++; // å
      if(input.length() == 0)
        break;
      
    }//skriver ut resultat
    System.out.println("å: " + teller); 
    System.out.println("æ: " + teller2);
    System.out.println("ø: " + teller3);
  } 
}
Burde ikke den while løkken fungere? Jeg får feilmeldingen:
';' expected (linje 15)
Anbefaler deg å begynne å tenke i pseudo-kode først.. altså først finne ut hvordan du vil at programmet ditt skal fungere, og etterpå sette deg ned å plundre med å faktisk få til koden. Å plundre med syntaks samtidig med at man forsøker å finne ut hvordan koden skal virke er ikke en spesielt effektiv arbeidsmåte

Gjør det i flere steg, og legg på fler og fler detaljer for hvert steg.

Første forsøk

Kode

1. Lese inn verdier
2. Telle bokstaver
3. Skrive ut resultat
Andre forsøk

Kode

1. Lage variabel å lese resultat inn i

Les linje fra tastatur
Så lenge linje ikke er en tom streng:
        legg linje til i variabel
        les ny linje

2. Tell  bokstaver

3. Skriv resultat
.. når du har en viss ide om hvordan programmet burde se ut, begynn med kodingen:

Kode

import java.util.Scanner;
public class test {
  public static void main (String[]args) {
        Scanner tastatur = new Scanner(System.in);
        String skalsjekkes = "";

        String input = tastatur.nextLine();
        while(not input.equals("\n")){
              skalsjekkes = skalsjekkes + input
              String input = tastatur.nextLine();
        }
        system.out.print(skalsjekkes)
    }
}
Dette er da første forsøk på skritt nummer 1 (er årevis siden jeg kodet java forøvrig, beklager eventuelle dumme feil). Når denne kompilerer og fungerer, forsøk deg videre på skritt nummer 2.

Hvis du ikke deler opp det du skal gjøre i mindre oppgaver har du ingen sjanse overhode til å lage større programmer. Når du koder; løs alltid en og en oppgave.

Sørg for at det du har skrevet både kompilerer og fungerer før du forsøker å løse neste oppgave. Hvis ikke blir det er reint helvete å finne eventuelle bugs og feil. Hvis du sørger for at de første 30 linjene fungerer, og deretter legger på 2 linjer til som gjør at programmet fucker opp, er det rimelig enkelt å gjette hvor feilen ligge. Skriver du 32 linjer uten å teste blir det fort.. interessant.. å finne feilen.

Hele poenget med koding er å dele opp en oppgave i mindre og mindre deler, helt til du har kommet ned til små nok deler til at du har kommandoer du kan bruke... uansett hvilket språk du bruker