Inlägg

Inlägg som ProgrammeringElev har skrivit i forumet
Av ProgrammeringElev
Skrivet av Tazavoo:

Du måste tänka efter lite nu, gå igenom den felande raden och tänk på vad varje del får för värde.

Du sa att felet kommer i följande rad:
if (s.charAt(0)== wg.get(wg.size()-1).charAt(s.length()-1))

Säg att wg innehåller orden ['hej', 'test']. Du har just matat in ordet 'butik', som lagras i s.
Vilket värde får då s.charAt(0)? Vad får we.get(wg.size()-1)? Vad får s.length()-1? Vad får wg.get(wg.size()-1).charAt(s.length()-1)?

Att du lagrar ordet i en temporär variabel är helt korrekt. Du kan också lagra wg.get(wg.size()-1) i en temporär variabel om du vill, så kanske felet kommer fram.

Tack jag ska prova att göra med temporär variabel och prova igen på helgen

Av ProgrammeringElev
Skrivet av Baxtex:

Vet inte om du fått svar men här är mina spontana kommentarer(ursäkta om jag låter vresig ):

Du undrade varför dina breaks inte fungerade? Det är för att du försöker bryta dig ur if statementet efter att du redan visat dialogen. Break fyller ingen funktion här.

I dina if's kollar du även alltid om i>0 och ja det är det ju alltid så länge loopen körs, så det behöver du inte kolla.

Du har en konstruktor som aldrig kallas vad vi kan se, så den kan du ta bort.

Jag förstår inte vad for loopen är till för, den loopar 1000 gånger? Till vilken mening?

IndexOutOfBounds kastas när du, mycket riktigt, försöker använda ett index som inte ligger i intervallet. Tänk på nollindexeringen.

Förstår inte riktigt varför du ska lagra input strängen i en lista, blir det inte onödigt komplext när du egentligen bara ska jämföra två strängar åt gången?

Rent allmänt är koden ganska svårläst, försök skriv om den så blir det enklare att felsöka. Gör inte för mycket på samma rad, har tydligare variabel namn etc.

Här är mitt försök:

import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JTextArea; public class WordGame extends JFrame { public static JTextArea tA = new JTextArea(100, 100); public static void main(String[] args) { String first = ""; String second = ""; while (true) { // Input first = JOptionPane.showInputDialog("Skriv första ordet:"); second = JOptionPane.showInputDialog("Skriv andra ordet:"); if (first == null || second == null) { JOptionPane.showMessageDialog(tA, "Du måste ange två ord, spelet är slut!"); break; } // Error checking if (!first.matches("[a-zA-Z]+") || !second.matches("[a-zA-Z]+")) JOptionPane.showMessageDialog(tA, "Ord kan bestå bara av bokstäver!"); else if (first.equals(second)) JOptionPane.showMessageDialog(tA, "Du kan inte mata in samma ord två gånger!"); else if (first.charAt(first.length() - 1) != second.charAt(0)) JOptionPane.showMessageDialog(tA, "Ordets första bokstav måste ha samma bokstav som förra ordets sista bokstav"); else JOptionPane.showMessageDialog(tA, "Yay, ordet " + first + " sista bokstav matchar ordet " + second + " första bokstav!"); } } }

Har inte testat så noga, men tror den gör det du vill.

Tack för ditt svar! Men jag har en fråga. Hur kan programmet komma ihåg ordet om man inte lägger det till någon array eller lista? Jag vill att program ska komma ihåg alla order som jag har mattat in och jämföra..

Av ProgrammeringElev
Skrivet av Tazavoo:

@ProgrammeringElev: Som nämnts tidigare i tråden är det säkert för att du använder s.length. Är du säkert på att det är s du skall använda?

Tyvärr jag är inte så säkert.
Min plan är att program ska jämföra ord som jag skrev nu med ord som ligger i listans sista platsen. Jag tänkte att skapa ett temporär värde och varje gång när man lägger ett ord till listan, det ord blir temporärt. Men jag har aldrig använt och aldrig sett i boken att man använder temporär värde när man använder lista i for-satsen . (När man gör det med array, jag såg det massa gånger. Till exempel när man gör sortering)

Det var bara min tanke. Jag vet inte om det är rätt väg..

Av ProgrammeringElev
Skrivet av Tazavoo:

@ProgrammeringElev: Om du ännu har problem så tänk på att både listor och strings använder nollindexering (d.v.s. precis som array så är först värdet på plats 0, inte 1).

Säg att din lista har två värden: "han", "näsa"
Då finns "han" på plats 0, och "näsa" på plats 1
list.size() returnerar 2.
Försöker du ta list.get(list.size()) får du IndexOutOfBounds, för inget element finns på plats 2. Du bör därför ta list.get(list.size()-1) för att få sista. Precis samma sak gäller för en String, someString.charAt(someString.length()-1) för att få sista.

Vet inte om metoden getLast() du pratar om hör till List eller String, men den löser säkert problemet för den åtminstone.

Tack för ditt svar!
Jag har redigerat mitt kod som du har sagt.

Men efter det, när man skriver ett lång ord, man får StringOutOfBoundsException på samma rad

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3 at java.lang.String.charAt(String.java:658) at SelfTest.WordGame.main(WordGame.java:38) C:\Users\Secret\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED (total time: 7 seconds)

jag får error på charAt. Men, i raden
if (s.charAt(0)== wg.get(wg.size()-1).charAt(s.length()-1))
finns två charAt. Vilket charAt måste man tänka?

Av ProgrammeringElev
Skrivet av ante84:

wg.get(wg.size()).charAt(s.length())==s.charAt(0))

Här hämtar du sista elementet från den länkade listan men du använder den inmatade strängens längd och försöker indexera i strängen i listan.
Något sånt här borde fungera.

String l = wg.getLast();
if (l.charAt(l.length()) !=s.charAt(0)) {
...
}

Tack för svar! Men min netbeans visar att jag inte har metoden getLast()

Av ProgrammeringElev

@ProgrammeringElev:

Jag har kollat min kod en gång till och jag har märkt att problem var att jag skrev s!=null. Jag tog bort själv while sats och problem med break sats är löst. Men andra problem är fortfarande irriterande.. Jag har provat att byta plats s.charAt(0) och wg.get bla bla men det fungerar inte.

Av ProgrammeringElev

Java IndexOutOfBoundsException

Hej
Jag vill att säga ursäkta med språket(Jag är invandrare)

Jag har skapat ett egen ordspel i Java(Mitt första minispel som jag skapar ensam)
Regler är så:
Först man skriver ett ord. Till exempel Sweclockers
Nästa ord som man skriver, måste börja med samma bokstav som förra ordets sista bokstav. Till exempel Sverige.
Efter det emotion. Ord ska ha bara bokstäver och man får inte skriva samma ord två gånger. Spel ska försättas tills när man bryter mot regeln.(eller tusen gångar)

Min kod ses ut så här:

package SelfTest; import java.awt.*; import javax.swing.*; import java.util.List; import java.util.LinkedList; public class WordGame extends JFrame{ public static JTextArea ja = new JTextArea(100,100); public WordGame(){ add(ja); setSize(500,500); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main (String [] args){ List <String> wg = new LinkedList<String>(); String s = ""; while(s!=null){ for(int i = 0; i<=1000;i++){ s = JOptionPane.showInputDialog("Skriv ord"); s.toLowerCase(); if(s.matches("[a-zA-Z]+")&&(i==0)){ ja.setText(s); wg.add(s); } if(i>0&&s.matches("[a-zA-Z]+")&&!wg.contains(s)) { if (wg.get(wg.size()).charAt(s.length())==s.charAt(0)){ wg.add(s); } } if(!s.matches("[a-zA-Z]+")){ JOptionPane.showMessageDialog(ja, "Ord kan bestå bara av bokstäver"); break; } if(i>0&&wg.contains(s)){ JOptionPane.showMessageDialog(ja, "Du kan inte skriva samma ord två gånger"); break; } if(i>0&&wg.get(wg.size()-1).charAt(s.length())!=s.charAt(0)){ JOptionPane.showMessageDialog(ja, "Ordets första bokstav måste ha samma bokstav som förra ordets sista bokstav"); break; } } } } }

Jag har två problem de break satserna ligger i while satsen. Men, de fungerar inte. Man försätter visa dialogruta. Varför är det?(Inte viktig fråga)
(Viktig fråga) När man skriver två ord rätt till exempel (han - näsa) programmet visar IndexOutOfBoundsException på raden

if (wg.get(wg.size()).charAt(s.length())==s.charAt(0))

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 at java.util.LinkedList.checkElementIndex(LinkedList.java:555) at java.util.LinkedList.get(LinkedList.java:476) at SelfTest.WordGame.main(WordGame.java:36) C:\Users\Secret\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED (total time: 5 seconds)

Men jag förstår inte varför?? man räknar ut listans size och sista index. Med hjälp av charAt vi räknar ut sista indexets sista bokstav och jämför om är det lika med ordets första index som jag skrev nu. Om de är lika, det ord ska adderas till listan.

Förstår jag någonting fel???

JFrame, list och JTextArea jag har inte klarat och jag kan klara det med ingen problem. Jag har skrivit logiska algoritmer först

Av ProgrammeringElev
Skrivet av perost:

Du skapar din FileWriter inuti while-loopen, så du kommer alltså öppna filen för varje karaktär du skriver. Och eftersom standardläget för FileWriter är att skriva över allt i filen så bör Hello2.txt till slut innehålla endast det sista tecknet från filen som du läser ifrån, vilket troligtvis är ett nyradstecken (och alltså osynligt). Flytta bw till ovanför while-loopen så att ut-filen bara öppnas en gång så kommer det säkert gå bättre.

Skrivet av Tazavoo:

Du måste självklart ha bw.write(c); innanför while-loopen. Även om du följer en bok skulle jag rekommendera att faktiskt funderar på vad koden gör också, av dina frågor att döma verkar du skriva kod utan att veta varför.

Skrivet av Teknocide:

Med Java 8 går detta att beskriva på ett enklare sätt:

public void convertToLowerCase(Path in, Path out) { // Finess #1 från Java8: try-with-resources, stänger automatiskt resursen om ett fel uppstår // Finess #2: Streams. Data går direkt från infilen till utfilen utan att allting mellanlagras i datorns minne. try (Stream<String> lines = Files.lines(in)) { // Finess #3: Method references. lines.map(String::toLowerCase) kan även skrivas lines.map(line -> line.toLowerCase()) Iterable<String> lowercased = lines.map(String::toLowerCase)::iterator; Files.write(out, lowercased); } catch (IOException e) { e.printStackTrace(); } }

Tack alla för snälla svar!!

Av ProgrammeringElev
Skrivet av Dalton Sleeper:

Det kan det visst bli, dock kan det bli enklare ur design- och kodarsynvinkel om ett standard bostadshus är isolerad by default, för vi antar väll att bostadshus (där folk ska bo) är isolerade? Men, om det skulle uppstå någon avvikelse av någon anledning, nybyggt, renovering, så går det att ändra parametern via en extra konstruktor. I vissa fall kan det vara jobbigt att behöva sätta alla parametrar varje gång man skapar ett object, ibland kan det finnas betydligt fler, som man dessutom nästan aldrig behöver bry sig om.

Tack så mycket!!! Nu känner jag mycket bättre

Av ProgrammeringElev
Skrivet av Dalton Sleeper:

Tack för hjälp!!!:)
Men blir det inte enklare och effektivare om vi skriver boolean true eller false direkt i den metod med 4 argument?

Av ProgrammeringElev
Skrivet av Dalton Sleeper:

Den kan inte ha hur många parametrar som helst helt utan vidare, det måste matcha några av de andra konstruktorerna i Bostadshus och råkar i detta fall matcha Bostadshus(double l, double b, int v, boolean isol).

Dvs, this(l, b, v, true) resolvar till Bostadshus(double l, double b, int v, boolean isol)!

Aha jag tror nu jag förstår lite grann..

Bostadshus(double l, double b, int v){ this(l, b, v, true) }

kan ha boolean true eftersom där finns konstruktor med 4 argument?

Bostadshus(double l, double b, int v){ this(l, b, v, true) }

metod kan inte användas om vi inte skapar konstruktor

Bostadshus(double l, double b, int v, boolean isol){ super(l,b,v); tilläggsisolerat=isol; }

rätt? men den metod kan användas utan

Bostadshus(double l, double b, int v){ this(l, b, v, true) }

det? Förstår jag rätt?

Av ProgrammeringElev
Skrivet av Full Strike:

Det är två olika konstruktorer. Du kan instansiera klassen på flera sätt:

new Bostadshus(1.0,1.0,1)

eller

new Bostadshus(1.0,1.0,1,true)

Väljer du den senare metoden har du möjlighet att specificera om det ska vara tilläggsisolerat eller inte, använder du den första konstruktorn kommer den alltid sättas till true.

Edit:
Fördelen är alltså att det blir färre argument som behöver skickas med i de fall där du vet att det ska vara tilläggsisolerat. I många andra språk kan man sätta defaultvärden på parametrar, men i java måste man overloada på det här sättet.

Skrivet av snajk:

@ProgrammeringElev: I den ena skickar du med en bool som anger ifall huset är isolerat eller ej, i den andra gör man inte det utan förutsätter att det är det (isolerat alltså). Den andra anropar ju den första och skickar med de parametrar den har fått samt då true för isoleringen. Det handlar om att förenkla anropet, du skulle lika gärna kunna använda den första för allt men om merparten av husen som skapas är isolerade så kan det vara skönt att kunna skippa att skicka true på de som är det.

Skrivet av Dalton Sleeper:

Om vi först tittar på konstruktorn nedan:

Bostadshus(double l, double b, int v) { this(l, b, v, true); }

Denna skickar vidare l, b, v samt isol=true till ytterligare en av Bostadshus konstruktorer, nämligen

Bostadshus(double l, double b, int v, boolean isol) { super(l,b,v); tilläggsisolerat=isol; }

Här sätts l, b, v till Hus via Huskonstruktorn och isol sätts till Bostadshus via vanlig tilldelning.

Däremot, om du kallar nedanstående direkt så måste du själv sätta parametern isol till true för att få samma effekt, så visst finns det skillnad även om den är liten.

Bostadshus(double l, double b, int v, boolean isol) { super(l,b,v); tilläggsisolerat=isol; }

Edit: too late

Tack alla för snälla svar!
Men jag har en fråga till

Bostadshus(double l, double b, int v){ this(l, b, v, true) }

Varför kan vi skriva boolean true här när parametern har bara tre argument double och int ? Kan this ha hur mycket argument som helst??

Av ProgrammeringElev

Java konstruktorer vid arv

Hej
Först jag vill att säga ursäkta med språket.
Jag läser programmering 2 nu själv och jag förstår inte riktigt "Konstruktorer vid arv"

Jag har en exempel från lärobok

public class Bostadshus extends Hus{ boolean tilläggsisolerat; Bostadshus(boolean isol){ tiläggsisolerat = isol; } Bostadshus(){ tilläggsisolerat= true; } Bostadshus(double l, double b, int v, boolean isol){ super(l,b,v); tilläggsisolerat=isol; } Bostadshus(double l, double b, int v){ this(l, b, v, true); } övriga metoder }

För mig, den exempel är svårt att förstå. Varför skriver tilläggsisolerat=isol; två gånger? Varför måste vi göra metod

Bostadshus(double l, double b, int v){ this(l, b, v, true); }

när vi redan har

Bostadshus(double l, double b, int v, boolean isol){ super(l,b,v); tilläggsisolerat=isol; }

?? Vad är skillnad mellan dem?? Finns förklaring i min lärobok men jag förstår inte exakt..

Av ProgrammeringElev
Skrivet av perost:

Du skapar din FileWriter inuti while-loopen, så du kommer alltså öppna filen för varje karaktär du skriver. Och eftersom standardläget för FileWriter är att skriva över allt i filen så bör Hello2.txt till slut innehålla endast det sista tecknet från filen som du läser ifrån, vilket troligtvis är ett nyradstecken (och alltså osynligt). Flytta bw till ovanför while-loopen så att ut-filen bara öppnas en gång så kommer det säkert gå bättre.

Tack för din respons!
Men Jag tänkte det också i början. Men om man flyttar ut bw från while satsen, Java visar att jag måste skapa ny lokal variabel c.
Om man skapar det, java visar att initialisera det till 0 (resultat är samma)
Därför jag tänkte att bw kanske ska liggas i while-satsen

Jag tror att problemet beror på att FileWriter får inget data från textfilen.. eftersom om jag lägger till system.out.print(c) i while-satsen och till Character.toLowerCase, programmet visar data från textfil allt bra. Men problem är att i uppgiften står att man ska inte ha någon utskrift..

Av ProgrammeringElev

Hur gör man för att läsa data och kopiera det till annan textfil?

package Kapitel9; import java.util.*; import java.io.*; public class Uppgift1_Kap9 { public static void main (String[] args) throws IOException{ Scanner sc = new Scanner(System.in); System.out.print("Infilens namn?"); System.out.flush(); String namn = sc.next(); BufferedReader inFil = new BufferedReader(new FileReader(namn)); int i; while((i = inFil.read())!=-1){ char c = (char)i; if(Character.isUpperCase(c)) Character.toLowerCase(c); BufferedWriter bw = new BufferedWriter(new FileWriter ("Hello2.txt")); bw.write(c); } } }

Det är min kod. Java skapar programmet Hello2.txt men textfil skapas tomt. Jag tror det finns fel i While satsen men har ingen aning hur ska jag byta det
Man ska inte ha någon system.out.print för att skriva ut texter från textfil.

Av ProgrammeringElev
Skrivet av furbel:

Det verkar funka för mig i alla fall, tog din kod, satte in klassen i katalogen, ändrade code taggen och satte in "" på alla attribut, se bilden.

http://imgur.com/a/bmwDD

Jag står alltså i "test" och kör appletviewer index.html som har applet taggen, och PolyDemo klassen ligger i katalogen Exempel_KAP9

Kontrollera allt emot den lösningen på bilden.

Hos mig resultat är samma... NumberFormatException.. Förstår inte varför.....
Kan du kopiera din kod här? Jag tror det blir bättre om jag kopierar din kod och se vad händer.. och vad är skillnad..

Av ProgrammeringElev
Skrivet av furbel:

Du får göra lite strategiska utskrifter med System.out.println("...") precis före där felet uppstår. Lämpligtvis skriva ut parametrar och sådant för att se vad som kommer in.

Ska det stå någonting i "..."?jag har provat att klistra in det innan raden 18 men händer inget speciellt. Bara visar ... före error utskrift

Av ProgrammeringElev
Skrivet av furbel:

Pröva med "" runt alla html attribut.

<param name="antal" value="7">
<param name="radie" value="100">

Jag har provat som har du sagt.. men fortfarande visar NumberFormatException null på raden n = Integer.parseInt(s); Jag tror det är konstigt eftersom jag har skrivit exakt exakt lika som står i min lärobok .. men i min lärobok koden fungeras jättebra ( Författare visade figur som man får)

Av ProgrammeringElev
Skrivet av furbel:

Nu var det väldigt länge sedan jag gjorde något med applets men tror den söker efter Exempel_KAP9/PolyDemo.class eftersom du har package Exempel_KAP9

code attributet ska nog vara code="Exempel_KAP9.PolyDemo" och klassen ska ligga i en katalog med namnet Exempel_KAP9

Jag har löst problem delvist.
Konsol visade ClassNotFoundException eftersom html hade samma namn som java fil. Men nu visar det null NumberFormatException på raden 18 (html fil lägger i samma folder var java fil lägger)

n = Integer.parseInt(s);

...

Av ProgrammeringElev

Applet är inte initierad

Hej
Förlåt för jätte många frågor... men jag har en jätte seriös fråga
I min lärobok finns ganska många uppgifter som krävs att köra Applet.
Men, min dator "ALDRIG" vill att köra Applet

Jag har en exempel kod från min lärobok

package Exempel_KAP9; import java.awt.*; import javax.swing.*; public class PolyDemo extends JApplet { int n, r, x0, y0; double vinkel; int[]x,y; public void init() { String s = getParameter("antal"); n = Integer.parseInt(s); s = getParameter("radie"); r = Integer.parseInt(s); x0 = getSize().width/2; y0 = getSize().height/2; x = new int[n]; y = new int[n]; vinkel = 2*Math.PI/n; for(int i = 0; i<n; i++){ double v = i*vinkel; x[i] = x0 + (int)Math.round(r*Math.cos(v)); y[i] = y0 - (int)Math.round(r*Math.sin(v)); } } public void paint(Graphics g) { g.fillPolygon(x,y,n); } }

Det är kod från min lärobok när man kör det, Java måste visa ett sjuhörnig polygon.
Det är HTML fil från lärobok

<html> <head> <title>PolyDmeo</title> </head> <body> <applet code = PolyDemo.class width = 250 height=250> <param name = antal value =7> <param name = radie value =100> </applet> </body> </html>

Jag har skrivit exakt lika som står i boken.
Men när jag kör program, Netbeans kommandofönstret visar load: hittade inte klassen PolyDemo.class.

java.lang.ClassNotFoundException: PolyDemo.class at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:219) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:152) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at sun.applet.AppletClassLoader.loadCode(AppletClassLoader.java:634) at sun.applet.AppletPanel.createApplet(AppletPanel.java:799) at sun.applet.AppletPanel.runLoader(AppletPanel.java:728) at sun.applet.AppletPanel.run(AppletPanel.java:378) at java.lang.Thread.run(Thread.java:745)

och i Applet fönstret står Starta: Applet är inte initierad

Min dator vill inte öppna alla typer av appleter. Jag har provat kanske 5~6 appleter men inga öppnades.
Appletviewer som ligger i mappen jdk1.8.0_101 och jdk1.8.0_73 fungerar inte alltså ( De stängs automatiskt efter 1 sekund)
Vad måste jag göra ?? Installera om dator?