Vinnaren i pepparkakshustävlingen!
2017-09-10, 22:04
  #6949
Moderator
Protons avatar
Citat:
Ursprungligen postat av ozyrecon
Har lite kod till ett tidtagarur som jag hittade i en övningsbok. Jag är ganska ny på Java så om någon har gjort en liknande kanske kan visa hur man verkligen får igång klockan när man trycker på start. Är inte alls med på hur den metoden skall skrivas. Här är klasser för själva klockan samt GUI och en main.
Här är stegen som ska uppfyllas. Har läst om trådar så är införstådd hur det fungerar.

-When the start button is pressed. Create a new thread that do the following in the
run method. Sleep for 100ms and call the appropriate method in a stopwatch object.
Run this as an infinite loop until stop has been pressed.

- After each clock tick update the time of the stopwatch.
- When stop is pressed, the timer thread should stop. Note that the proper way to
stop a running thread is to interrupt it and then let the thread exit in a controlled way.
Never use terminate operation if you can avoid it.
- When reset is pressed the time should be set to 0:0:0.0 again.


Kod:
import java.awt.EventQueue;
import javax.swing.JFrame;



public class StopWatch {
    private WatchGUI myGui;
    private int hours;
    private int min;
    private int sec;
    private int dsec; //1/10 second
    
    public StopWatch(){
        //initiate time
        hours=0;
        min=0;
        sec=0;
        dsec=0;
        //create GUI
        myGui = new WatchGUI(this);
        EventQueue.invokeLater(() -> {
            myGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            myGui.setVisible(true);
        });
    }
    
    public void start(){
        System.out.println("start");
    }
    
    public void stop(){
        System.out.println("stop");
    }
     
    public void reset(){
        System.out.println("reset");
    }
    
    public void tick(){
        System.out.println("tick");
    }
}

Kod:
import java.awt.*;
import java.awt.event.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;

public class WatchGUI extends JFrame{
    private StopWatch myWatch; //need a reference to signal input
    private JTextArea textArea; //write status text
    private JLabel timeLabel; //the time
    
    public WatchGUI(StopWatch sWatch){
        myWatch=sWatch;
        
        setTitle("StopWatch");
        setSize(500,300);
        
        //ctreate buttons to control stopwatch
        JButton startButton=new JButton("Start");
        JButton stopButton=new JButton("Stop");
        JButton resetButton=new JButton("Reset");
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(startButton);
        buttonPanel.add(stopButton);
        buttonPanel.add(resetButton);
        add(buttonPanel,BorderLayout.NORTH);
        //add listener to each button
        GUIListener startAction= new GUIListener("Start");
        startButton.addActionListener(startAction);
        GUIListener stopAction= new GUIListener("Stop");
        stopButton.addActionListener(stopAction);
        GUIListener resetAction= new GUIListener("Reset");
        resetButton.addActionListener(resetAction);
        
        //add a textArea to print status
        JPanel tPanel= new JPanel();
        textArea = new JTextArea(10,44);
        tPanel.add(textArea);
        add(tPanel,BorderLayout.SOUTH);
        timeLabel=new JLabel("00:00:00.0");
        timeLabel.setFont(new Font("Serif", Font.PLAIN, 48));
        JPanel timePanel= new JPanel();
        timePanel.add(timeLabel);
        add(timePanel,BorderLayout.CENTER);
    }
    
    public void writeStatus(String text){
        textArea.append(text);
    }
    
    public void writeTime(String time){
        timeLabel.setText(time);
    }
    
    private class GUIListener implements ActionListener {
        private String text;
        
        public GUIListener(String message){
            text=message;
        }
        
        @Override
        public void actionPerformed(ActionEvent event){
            //notify in status that a button is clicked
            writeStatus(getCurrentTimeStamp());
            writeStatus(text);
            writeStatus(" button pressed\n");
            //notify my stopwatch that a button ha been clocked
            if(text=="Start")
                myWatch.start();
            if(text=="Stop")
                myWatch.stop();
            if(text=="Reset")
                myWatch.reset();
        }
        
        public String getCurrentTimeStamp() {
            SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");//dd/MM/yyyy
            Date now = new Date();
            String strDate = sdfDate.format(now);
            strDate+=": ";
            return strDate;
        }
    }
}

Kod:
 public static void main(String[] args) {
       //create stopwatch
       StopWatch swatch= new StopWatch();
    }
    
Ja så vad är problemet?

Du skriver att du vet hur trådar funkar, ändå finns det ingen kod för att lägga stoppuret i sin egen tråd.

Ditt GUI kommer troligen behöva implementera interfacet Runnable för att kunna starta en tråd, eftersom det redan ärver från en jframe, läs på om hur du skapar trådar så bör det framgå tydligare vad du behöver göra.
Citera
2017-09-16, 13:39
  #6950
Medlem
Tjena! Håller på med java i skolan och har koden:

import se.itu.systemet.storage.ProductLine;
import se.itu.systemet.storage.ProductLineFactory;
import se.itu.systemet.domain.Product;

import java.util.List;
import java.util.Iterator; // If you want to try looping with an Iterator


public class TestingObjects {
public static void main(String[] args) {

Product aProduct = new Product("Lillan", 79.00, 122.00, 99);
Product anotherProduct = new Product("Lillen", 67.00, 112.00, 98);

}
}

Men när jag ska compila får jag följande:

$ javac TestingObjects.java
TestingObjects.java:1: error: package se.itu.systemet.storage does not exist
import se.itu.systemet.storage.ProductLine;
^
TestingObjects.java:2: error: package se.itu.systemet.storage does not exist
import se.itu.systemet.storage.ProductLineFactory;
^
TestingObjects.java:3: error: package se.itu.systemet.domain does not exist
import se.itu.systemet.domain.Product;
^
TestingObjects.java:12: error: cannot find symbol
Product aProduct = new Product("Lillan", 79.00, 122.00, 99);
^
symbol: class Product
location: class TestingObjects
TestingObjects.java:12: error: cannot find symbol
Product aProduct = new Product("Lillan", 79.00, 122.00, 99);
^
symbol: class Product
location: class TestingObjects
TestingObjects.java:13: error: cannot find symbol
Product anotherProduct = new Product("Lillen", 67.00, 112.00, 98);
^
symbol: class Product
location: class TestingObjects
TestingObjects.java:13: error: cannot find symbol
Product anotherProduct = new Product("Lillen", 67.00, 112.00, 98);
^
symbol: class Product
location: class TestingObjects
7 errors

Vad gör jag för fel?
Citera
2017-09-16, 14:36
  #6951
Moderator
Protons avatar
Citat:
Ursprungligen postat av wmathyy
Tjena! Håller på med java i skolan och har koden:

import se.itu.systemet.storage.ProductLine;
import se.itu.systemet.storage.ProductLineFactory;
import se.itu.systemet.domain.Product;

import java.util.List;
import java.util.Iterator; // If you want to try looping with an Iterator


public class TestingObjects {
public static void main(String[] args) {

Product aProduct = new Product("Lillan", 79.00, 122.00, 99);
Product anotherProduct = new Product("Lillen", 67.00, 112.00, 98);

}
}

Men när jag ska compila får jag följande:

$ javac TestingObjects.java
TestingObjects.java:1: error: package se.itu.systemet.storage does not exist
import se.itu.systemet.storage.ProductLine;
^
TestingObjects.java:2: error: package se.itu.systemet.storage does not exist
import se.itu.systemet.storage.ProductLineFactory;
^
TestingObjects.java:3: error: package se.itu.systemet.domain does not exist
import se.itu.systemet.domain.Product;
^
TestingObjects.java:12: error: cannot find symbol
Product aProduct = new Product("Lillan", 79.00, 122.00, 99);
^
symbol: class Product
location: class TestingObjects
TestingObjects.java:12: error: cannot find symbol
Product aProduct = new Product("Lillan", 79.00, 122.00, 99);
^
symbol: class Product
location: class TestingObjects
TestingObjects.java:13: error: cannot find symbol
Product anotherProduct = new Product("Lillen", 67.00, 112.00, 98);
^
symbol: class Product
location: class TestingObjects
TestingObjects.java:13: error: cannot find symbol
Product anotherProduct = new Product("Lillen", 67.00, 112.00, 98);
^
symbol: class Product
location: class TestingObjects
7 errors

Vad gör jag för fel?
Första felet är att du uppenbarligen inte läst https://www.flashback.org/announcement.php?f=210, gör det innan nästa postning tack.

Andra felet beror på att de JARfiler med dessa komponenter inte ligger i din CLASSPATH eller nånstans där kompilatorn kan hitta dem, har du laddat hem dessa JAR-filer? Det är nämligen nån slags tredjepartsgrej och ingår inte som standard i java.
Citera
2017-09-16, 14:37
  #6952
Medlem
Citat:
Ursprungligen postat av wmathyy
Tjena! Håller på med java i skolan och har koden:

Vad gör jag för fel?


Problemet är att programmet inte kan hitta klassen Product, som ska ligga i paketet se.itu.systemet.domain, som den inte hittar. Se till så att du har tillgång till alla javafiler och att de ligger på rätt ställe.

ps. se till att använda CODE eller PHP taggar runt din kod så att den förblir indenterad. Sen kan du även ha den inom SPOILER taggar så att det går att minimera och inte ta upp så stor plats.
Citera
2017-09-24, 15:12
  #6953
Medlem
Jag försöker skapa en deadlock genom att filosoferna ska ta upp vänstra gaffeln först, när alla filosoferna tagit upp varsin i vänstra handen skall deadlocken åtgärdas men jag har helt fastnat. Jag har försökt med lite olika försök att skapa en deadlock men tror inte jag lyckats.
Hur skapar jag en deadlock är väl den första frågan eftersom jag iallafall behöver den för att åtgärda det.

Kod:
package diningphilosophers;

import java.util.logging.Level;
import java.util.logging.Logger;


public class Philosopher implements Runnable{
   private int id;
   private Table myTable;
   
   public Philosopher(int pid,Table tab){
       id=pid;
       myTable=tab;
   }
   
   @Override
   public void run(){
       for(int i=0;i<100;i++){
           try {
            //think
            System.out.println("Philosopher " + id + " thinks. Iteration "+ i);
            Thread.sleep((int)(Math.random()*100));
            //pick up chopsticks
            System.out.println("Philosopher " + id + " pick up left");
            myTable.getLeft(id);
            Thread.sleep((int)(Math.random()*10));
            System.out.println("Philosopher " + id + " pick up right");
            myTable.getRight(id);
            //eat
            System.out.println("Philosopher " + id + " eats. Iteration "+ i);
            Thread.sleep((int)(Math.random()*100));
            //release chopsticks
            System.out.println("Philosopher " + id + " drop left"); 
            myTable.releaseLeft(id);
            Thread.sleep((int)(Math.random()*10));
            System.out.println("Philosopher " + id + " drop right");
            myTable.releaseRight(id);
        } catch (InterruptedException ex) {
            Logger.getLogger(Philosopher.class.getName()).log(Level.SEVERE, null, ex);
        }           
       }
   }
}


Kod:
package diningphilosophers;


public class Table {
    
    int nbrOfChopsticks;
    private boolean chopstick[]; //true if chopstick[i] is available
    
    public Table(int nbrOfSticks){
        nbrOfChopsticks=nbrOfSticks;
        chopstick=new boolean[nbrOfChopsticks];
        for(int i=0;i<nbrOfChopsticks;i++){
            chopstick[i]=true;
        }
    }
    
    public synchronized void getLeft(int n) throws InterruptedException {
        //philosopher n picks up its left chopstick



        chopstick[n]=false;
    }
    
    public synchronized void getRight(int n) throws InterruptedException {
        //philosopher n picks up its right chopstick
        int pos=n+1;
        if(pos==nbrOfChopsticks)
            pos=0;

        chopstick[pos]=false;
    }
    
    public void releaseLeft(int n){
        //philosopher n puts down its left chopstick
        chopstick[n]=true;

    }
    
    public void releaseRight(int n){
        //philosopher n puts down its right chopstick
        int pos=n+1;
        if(pos==nbrOfChopsticks)
            pos=0;
        chopstick[pos]=true;

    }
}

Kod:
package diningphilosophers;


public class DiningPhilosophers {


    public static void main(String[] args) {
        int size=5; //number of philosophers and chopsticks
        Table tab=new Table(size);
        for(int i=0;i<size;i++){
            Thread th=new Thread(new Philosopher(i,tab));
            th.start();
        }
    }
}
Citera
2017-09-25, 13:51
  #6954
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av Rytve
Jag försöker skapa en deadlock genom att filosoferna ska ta upp vänstra gaffeln först, när alla filosoferna tagit upp varsin i vänstra handen skall deadlocken åtgärdas men jag har helt fastnat. Jag har försökt med lite olika försök att skapa en deadlock men tror inte jag lyckats.
Hur skapar jag en deadlock är väl den första frågan eftersom jag iallafall behöver den för att åtgärda det.

Kod:
package diningphilosophers;

import java.util.logging.Level;
import java.util.logging.Logger;


public class Philosopher implements Runnable{
   private int id;
   private Table myTable;
   
   public Philosopher(int pid,Table tab){
       id=pid;
       myTable=tab;
   }
   
   @Override
   public void run(){
       for(int i=0;i<100;i++){
           try {
            //think
            System.out.println("Philosopher " + id + " thinks. Iteration "+ i);
            Thread.sleep((int)(Math.random()*100));
            //pick up chopsticks
            System.out.println("Philosopher " + id + " pick up left");
            myTable.getLeft(id);
            Thread.sleep((int)(Math.random()*10));
            System.out.println("Philosopher " + id + " pick up right");
            myTable.getRight(id);
            //eat
            System.out.println("Philosopher " + id + " eats. Iteration "+ i);
            Thread.sleep((int)(Math.random()*100));
            //release chopsticks
            System.out.println("Philosopher " + id + " drop left"); 
            myTable.releaseLeft(id);
            Thread.sleep((int)(Math.random()*10));
            System.out.println("Philosopher " + id + " drop right");
            myTable.releaseRight(id);
        } catch (InterruptedException ex) {
            Logger.getLogger(Philosopher.class.getName()).log(Level.SEVERE, null, ex);
        }           
       }
   }
}


Kod:
package diningphilosophers;


public class Table {
    
    int nbrOfChopsticks;
    private boolean chopstick[]; //true if chopstick[i] is available
    
    public Table(int nbrOfSticks){
        nbrOfChopsticks=nbrOfSticks;
        chopstick=new boolean[nbrOfChopsticks];
        for(int i=0;i<nbrOfChopsticks;i++){
            chopstick[i]=true;
        }
    }
    
    public synchronized void getLeft(int n) throws InterruptedException {
        //philosopher n picks up its left chopstick



        chopstick[n]=false;
    }
    
    public synchronized void getRight(int n) throws InterruptedException {
        //philosopher n picks up its right chopstick
        int pos=n+1;
        if(pos==nbrOfChopsticks)
            pos=0;

        chopstick[pos]=false;
    }
    
    public void releaseLeft(int n){
        //philosopher n puts down its left chopstick
        chopstick[n]=true;

    }
    
    public void releaseRight(int n){
        //philosopher n puts down its right chopstick
        int pos=n+1;
        if(pos==nbrOfChopsticks)
            pos=0;
        chopstick[pos]=true;

    }
}

Kod:
package diningphilosophers;


public class DiningPhilosophers {


    public static void main(String[] args) {
        int size=5; //number of philosophers and chopsticks
        Table tab=new Table(size);
        for(int i=0;i<size;i++){
            Thread th=new Thread(new Philosopher(i,tab));
            th.start();
        }
    }
}
Bara kollat lite snabbt, men är det vettigt att behandla (alltså ha olika metoder för) höger och vänster?
Och spelar det någon roll om en gaffel är ledig eller ej? Metoderna kollar ju inte utan markerar dem bara som upptagna samtidigt som vem som helst verkar kunna frigöra en viss gaffel.

(Använder de gafflar eller matpinnar???)

Semaforer verkar spontant lämpligt att använda, en binär sådan per gaffel.
https://docs.oracle.com/javase/7/doc...Semaphore.html
Citera
2017-09-25, 14:56
  #6955
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av Rytve
Jag försöker skapa en deadlock genom att filosoferna ska ta upp vänstra gaffeln först, när alla filosoferna tagit upp varsin i vänstra handen skall deadlocken åtgärdas men jag har helt fastnat. Jag har försökt med lite olika försök att skapa en deadlock men tror inte jag lyckats.
Hur skapar jag en deadlock är väl den första frågan eftersom jag iallafall behöver den för att åtgärda det.

Kod:
package diningphilosophers;

import java.util.logging.Level;
import java.util.logging.Logger;


public class Philosopher implements Runnable{
   private int id;
   private Table myTable;
   
   public Philosopher(int pid,Table tab){
       id=pid;
       myTable=tab;
   }
   
   @Override
   public void run(){
       for(int i=0;i<100;i++){
           try {
            //think
            System.out.println("Philosopher " + id + " thinks. Iteration "+ i);
            Thread.sleep((int)(Math.random()*100));
            //pick up chopsticks
            System.out.println("Philosopher " + id + " pick up left");
            myTable.getLeft(id);
            Thread.sleep((int)(Math.random()*10));
            System.out.println("Philosopher " + id + " pick up right");
            myTable.getRight(id);
            //eat
            System.out.println("Philosopher " + id + " eats. Iteration "+ i);
            Thread.sleep((int)(Math.random()*100));
            //release chopsticks
            System.out.println("Philosopher " + id + " drop left"); 
            myTable.releaseLeft(id);
            Thread.sleep((int)(Math.random()*10));
            System.out.println("Philosopher " + id + " drop right");
            myTable.releaseRight(id);
        } catch (InterruptedException ex) {
            Logger.getLogger(Philosopher.class.getName()).log(Level.SEVERE, null, ex);
        }           
       }
   }
}


Kod:
package diningphilosophers;


public class Table {
    
    int nbrOfChopsticks;
    private boolean chopstick[]; //true if chopstick[i] is available
    
    public Table(int nbrOfSticks){
        nbrOfChopsticks=nbrOfSticks;
        chopstick=new boolean[nbrOfChopsticks];
        for(int i=0;i<nbrOfChopsticks;i++){
            chopstick[i]=true;
        }
    }
    
    public synchronized void getLeft(int n) throws InterruptedException {
        //philosopher n picks up its left chopstick



        chopstick[n]=false;
    }
    
    public synchronized void getRight(int n) throws InterruptedException {
        //philosopher n picks up its right chopstick
        int pos=n+1;
        if(pos==nbrOfChopsticks)
            pos=0;

        chopstick[pos]=false;
    }
    
    public void releaseLeft(int n){
        //philosopher n puts down its left chopstick
        chopstick[n]=true;

    }
    
    public void releaseRight(int n){
        //philosopher n puts down its right chopstick
        int pos=n+1;
        if(pos==nbrOfChopsticks)
            pos=0;
        chopstick[pos]=true;

    }
}

Kod:
package diningphilosophers;


public class DiningPhilosophers {


    public static void main(String[] args) {
        int size=5; //number of philosophers and chopsticks
        Table tab=new Table(size);
        for(int i=0;i<size;i++){
            Thread th=new Thread(new Philosopher(i,tab));
            th.start();
        }
    }
}
En tanke angående metoderna getRight och releaseRight:

Vid ett bord med n filosofer finns n matpinnar.
Till höger om filosof n ligger matpinne 1.
För övriga filosofer gäller att till höger om en filosof m ligger matpinne m+1.

Filosof m ska alltså använda matpinne
Kod:
m%n+1
.
Citera
2017-09-25, 23:11
  #6956
Medlem
Hur ska jag göra för att se om en arraylist innehåller två eller fler av ett specifikt ord?

Till exempel en lista med bilar och jag vill se om "BMW" finns med två eller fler gånger.
Citera
2017-09-25, 23:27
  #6957
Moderator
Protons avatar
Citat:
Ursprungligen postat av Tweeky
Hur ska jag göra för att se om en arraylist innehåller två eller fler av ett specifikt ord?

Till exempel en lista med bilar och jag vill se om "BMW" finns med två eller fler gånger.
Här verkar de ta upp samma problem:

https://stackoverflow.com/questions/...ment-in-a-list

Notervärt är ju Collections-klassen som har en frequency-metod tydligen, eller så kan du tydligen även göra det med streams i java8.
Citera
2017-09-25, 23:44
  #6958
Medlem
Citat:
Ursprungligen postat av Proton
Här verkar de ta upp samma problem:

https://stackoverflow.com/questions/...ment-in-a-list

Notervärt är ju Collections-klassen som har en frequency-metod tydligen, eller så kan du tydligen även göra det med streams i java8.

Jag kanske tänker fel, har alltså en array med ett antal bilar.
Finns det en volvo så ska den skriva volvo.
Finns det 2 eller fler bmw och ingen volvo så ska den skriva bmw.
Finns det ingen volvo och 1 eller färre bmw ska den skriva audi.

Rörigt som tusan men jag har verkligen kört fast
Citera
2017-09-26, 01:02
  #6959
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av Tweeky
Hur ska jag göra för att se om en arraylist innehåller två eller fler av ett specifikt ord?

Till exempel en lista med bilar och jag vill se om "BMW" finns med två eller fler gånger.
Du kan ju köra metoderna indexOf och lastIndexOf. Ger de olika svar så finns det minst två, ger de samma svar så finns det som mest en.
Citera
2017-09-26, 01:46
  #6960
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av Tweeky
Hur ska jag göra för att se om en arraylist innehåller två eller fler av ett specifikt ord?

Till exempel en lista med bilar och jag vill se om "BMW" finns med två eller fler gånger.
Vill du använda interface (minska implementeringberoendet) så borde det gå att räkna med hjälp av metoderna hasNext och remove i Collection (inte Collections).
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback