Permalänk

Hjälp med en liten java-övning

Hej,

Jag är nybörjare med java (läser en kurs på universitet) och håller på med en övningsuppgift. Jag har kommit en bit på vägen men är nu fast och vet inte riktigt hur jag ska göra. Det vore grymt om någon kunnig kunde hjälpa mig :). Här bifogar jag uppgiften så att ni hajar vad det handlar om:

Citat:

Skriv ett litet Java-program (en klass med en main-metod) som frågar användaren efter ett antal textsträngar. Därefter skall programmet fråga användaren efter ett tecken och sedan skriva ut alla textsträngar som innehåller det angivna tecknet.

Programmet skall först fråga användaren efter hur många textsträngar som skall matas in. Därefter får användaren mata in alla dessa strängar. De olika textsträngarna läggs lämpligen i en array. Sedan frågas efter tecknet och slutligen skrivs alla de strängar som innehåller det angivna tecknet ut på skärmen. När programmet körs skall det se ut ungefär så här:

Hur många textsträngar? 7

Sträng 1> Hej Hopp
Sträng 2> Karamellkungen
Sträng 3> Papegoja
Sträng 4> 762 Höga Hus
Sträng 5> Gatsten
Sträng 6> Antal Harar
Sträng 7> Rulltrappa

Ange önskat tecken: H

Strängarna som innehåller H:

Hej Hopp
762 Höga Hus
Antal Harar

Om inget av orden innehåller det angivna tecknet skall ett meddelande om det skrivas ut:

Ingen av strängarna innehåller H

Och detta är hur koden ser ut än så länge:

Citat:

import java.util.Scanner;

class o7{

public static void main(String[]args){
Scanner sc=new Scanner(System.in);

System.out.print("Hur många textsträngar? ");
String plats=sc.nextLine();
int index = Integer.parseInt(plats);

String[] arr=new String[index];

int sp =0;
for(int ind=0; ind<arr.length; ind++){
sp++;
System.out.print("Sträng " +sp+ ">");
String st=sc.nextLine();
arr[ind] = st;

}

for(int ip=0; ip<arr.length; ip++){
System.out.print(arr[ip]+" ");
}

System.out.println();

System.out.print("Ange önskat tecken: ");
String letter=sc.nextLine();

System.out.println("Strängarna som innehåller "+letter+":");
}
}

Jag har alltså kommit till den delen där man skriva ut vilken eller vilka strängar som innehåller det specifierade tecknet. Och jag vet inte om jag ska göra en ny array för det strängar som bli utvalda eller om det funkar att lista upp dom på nåt sätt, samt hur gör jag överhuvudtaget för att "hitta" (i textsträngen) det tecken som blivit angivet och sedan returnera de texsträngar som innehåller ett sådant tecken?
Jag antar att det behövs t ex en for-loop och kanske en if-sats som avgör om tecknet förekommer eller inte, men hur gör jag som sagt detta? Och passar det sig att använda följande metod i detta tillfälle: public char charAt(int index)?

Tack!!
/Snorkelfarsan

Permalänk
Medlem

Nej, det passar sig inte att använda charAt().
Ta istället en titt på String.indexOf(str).

Och lämpligen loopar du igenom de sparade strängarna i 'arr' och om bokstaven hittas så skriver du ut den aktuella posten i arrayen. Du kan ha en booleansk variabel (med ursprungsvärdet false) som håller koll på om det har skrivits ut något, och när en bokstav hittas i en sträng sätter du variabeln till true. Efter att hela loopen har körts kontrollerar du om bokstaven hittades i någon sträng. Tips: indexOf() returnerar -1 om den eftersökta strängen inte hittas i orginalsträngen.

Permalänk

ok, tack! Jag ska ge det ett försök ikväll, återkommer med resultat eller nya frågor :).

btw, vad gör charAt?

Permalänk
Medlem

Den returnerar den char som finns på angivet index ur en sträng.

Exempel:

String s = "Lollapalooza"; char c = s.charAt(10); // c == 'z' här

Permalänk

Nu har jag nästan lyckats...

Citat:

for (int in = 0; in < arr.length; in++){

if ((arr[in].indexOf(letter)) != -1){
System.out.println(arr[in]+" ");
}
else
System.out.print(letter+" finns inte i någon av de angivna strängarna.");
}

...det enda problemet är när jag skriver in ett tecken som inte återfinns i någon sträng, skrivs felmeddelandet (alltså "finns inte i någon"...osv) ut så många gånger som loopen görs, vilket inte är så konstigt eftersom den ligger i loopen. Försöker jag dock lägga den utanför loopen så blir blir "else without if" eller nåt annat fel. Hur gör jag för att få den att bara skriva ut felmeddelandet en gång?

dvs: "letter" finns inte i någon av de angivna strängarna //slut

och inte: "letter" finns inte i någon av de angivna strängarna "letter" finns inte i någon av de angivna strängarna "letter" finns inte i någon av de angivna strängarna "letter" finns inte i någon av de angivna strängarna

Permalänk
Medlem

I och med att du måste söka igenom hela arrayen innan du vet om bokstaven fanns i något ord, så kan du inte lägga utskriften i loopen.

boolean found = false; for(int i = 0; i < arr.length; i++) { if(arr[i].indexOf(letter) != -1) { found = true; System.out.println("Bokstaven fanns i ordet: " + arr[i]); } } if(!found) System.out.println("Bokstaven " + letter + " fanns inte i någon av strängarna.");

Permalänk

Ok, jag experimenterade runt lite med flera if-satser och det funkade inte riktigt. Men det kan ju vara små saker som säller till det. Hade även en boolean på samma sätt som du skrivit nu, men jag tyckte den ställde till det och tog bort den. Jag gjorde något i stil med:

boolean b= false;
for (int in = 0; in < arr.length; in++){
if ((arr[in].indexOf(letter)) != -1){
b = true;
System.out.println(arr[in]+" ");
}
if (b = false) // Är inte det samma sak som "!b" (Eller !found som du skrev)?
System.out.print(letter+" finns inte i någon av de angivna strängarna.");
}

sen måste den ju vara utanför loopen. Det är intressant att i efterhand få se hur nära man vart lösningen flera gånger. ofta så inser man att det man gjorde i början kanske var rätt förutom ett fåtal parametrar, men eftersom det inte funkade så gick man vidare trots att det nästan var rätt.. händer alldeles för ofta.

Permalänk
Medlem

Nä, det är nästan samma sak. b == false i så fall. Men du har fortfarande jämförelsen inuti loopen, vilket du inte kan ha. Den måste flyttas utanför.

Permalänk

jag vet, men jag visade bara hur jag skrev förut Förresten hur skriver man kod i vb-kod här på forumet?

tack för hjälpen! programmet fungerar

Permalänk

Snorkelfarsan, jag antar att du går Dsv kand? Hade probs med den uppgiften också:)

Visa signatur

Datorn: i7 3770k, Gigabyte GA-Z77-DS3H, Corsair Vengeance 16gb, Gtx 680, Samsung 830 SSD 256gb, Seagate 1Tb, Fractal design R4, Corsair HX750 750W, DELL U2711.

Studerar: Civilingenjör IT på KTH, började HT 2009 och blir klar sommaren 2014.

Permalänk

Stämmer! 1:a året. Du med?

Permalänk

Yes!;-)

Visa signatur

Datorn: i7 3770k, Gigabyte GA-Z77-DS3H, Corsair Vengeance 16gb, Gtx 680, Samsung 830 SSD 256gb, Seagate 1Tb, Fractal design R4, Corsair HX750 750W, DELL U2711.

Studerar: Civilingenjör IT på KTH, började HT 2009 och blir klar sommaren 2014.

Permalänk
Medlem

Jag me, då ses vi på onsdagpubben!

Permalänk

lätt:). Kanske man är klar med första inluppen då.... NOT!

Permalänk

Får inte ni lära er programflöden?

1. Ta reda på hur många strängar man vill skriva.
2. Få in alla strängar.
3. Ta reda på vilken bokstav man söker.
4. Kolla om varje sträng innehåller bokstaven.
5. Skriva ut alla strängar som har bokstaven.

Jag skulle gjort följande i C#:

namespace Test { public static class Program { public static void Main ( string[] args ) { int numberOfStrings; string[] strings; do { System.Console.Write ( "Hur många textsträngar? " ); try { numberOfStrings = int.Parse ( Console.ReadLine ( ) ?? string.Empty ); break; } catch ( FormatException ) { System.Console.WriteLine ( "Ogiltligt tal." ); continue; } } while ( true ); strings = new string[numberOfStrings]; for ( int i = 0; i < numberOfStrings; i++ ) { System.Console.Write ( "Sträng {0}> ", ( i + 1 ) ); strings[i] = System.Console.ReadLine ( ); } char theChar; do { System.Console.Write ( "Ange önskat tecken: "); string temp = System.Console.ReadLine ( ); if ( string.IsNullOrEmpty ( temp ) ) continue; theChar = temp[0]; break; } while ( true ); System.Console.WriteLine ( "Strängarna som innehåller {0}:", theChar ); bool anyString = false; for ( int i = 0; i < strings.Length; i++ ) { if ( strings[i].IndexOf ( theChar ) != -1 ) { System.Console.WriteLine ( strings[i] ); } } if ( anyString ) System.Console.WriteLine ( "Ingen av strängarna innehåller {0}", theCar ); } } }

Permalänk

Jag/vi har inte börjat med c++, men det är ju inte så jättestor skillnad ser jag.

dom fem punkterna som du radade upp var ju i princip det jag gjorde, eller?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Snorkelfarsan
Jag/vi har inte börjat med c++, men det är ju inte så jättestor skillnad ser jag.

dom fem punkterna som du radade upp var ju i princip det jag gjorde, eller?

C++ är inte på något sett relaterat till C#, C# är mer av en Java-klon än en C++-klon.

Permalänk
Medlem

Abolsut inget fel med som det va men tycker det blir så mkt lättare att läsa...

Citat:

Ursprungligen inskrivet av bjornie

boolean found = false; for(String word : arr) { if(word.indexOf(letter) != -1) { found = true; System.out.println("Bokstaven fanns i ordet: " +word); break; } } if(!found) { System.out.println("Bokstaven " + letter + " fanns inte i någon av strängarna."); }

Jag hade nog nästan delat upp det på flera metoder också. Men jag är lite metod facist...

Visa signatur

LAN i stockholmv9
http://www.hazard.nu

Permalänk
Citat:

Ursprungligen inskrivet av You
C++ är inte på något sett relaterat till C#, C# är mer av en Java-klon än en C++-klon.

Ah ok, newbie mistake :P...

Citat:

Ursprungligen inskrivet av BoBo
Abolsut inget fel med som det va men tycker det blir så mkt lättare att läsa...

Jag hade nog nästan delat upp det på flera metoder också. Men jag är lite metod facist...

OK, jag förstår. Men det jag gör just nu är så pass basic att jag gör det bara så enkelt som möjligt

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Snorkelfarsan
Ah ok, newbie mistake :P...

OK, jag förstår. Men det jag gör just nu är så pass basic att jag gör det bara så enkelt som möjligt

Så ska man väll dock aldrig tänka. Bättre att lära sig rätt från början
Och det är enklare att förstå 3metoder på 10 rader än en metod på 30rader...

Visa signatur

LAN i stockholmv9
http://www.hazard.nu