0

生産システムをシミュレートしようとしています。私が何をしようとしているのかを簡単に説明するために、値を保存するためのいくつかのテーブルを持つパネルを作成します (いくつかのワークステーションとジョブタイプの妥当性について (下の図を参照))。実行すると、これらの値はさらに処理するために保存する必要があります。

以前の質問で、これらの値を格納するために TreeMaps を使用するように勧められたので、次のようなものを作成しました。

Station[num][type][avg_time][posx][posy][state]
Part[num][type][state]

これまでの私のコードは次のとおりです。

L.java

import java.awt.*;
import javax.swing.*;


public class L extends JFrame {

     public static final int ww = 1000;
     public static final int wh = 600;
     public static final int bgw = (ww - 30);
     public static final int bgh = (wh - 80);
     public static final String wt = "Teste";
    Color new_piece = new Color(255,0,0);
    Color progress_piece = new Color(255,215,0);
    Color ready_piece = new Color(173,255,47);
    Container pane = getContentPane();
    Dimension appletSize = pane.getSize();
    int wHeight = appletSize.height;
    int wWidth = appletSize.width; 
    DrawRectangle rectangle = new DrawRectangle();
    public TMap t;

    public L() {
        setSize(ww,wh);
        this.setTitle(wt);
//        Sim(int nparts);
        JButton startButton = new JButton("Start");        
        JButton stopButton  = new JButton("Stop");

        //... Add Listeners
       // startButton.addActionListener(new StartAction());
        //stopButton.addActionListener(new StopAction());

        //... Layout inner panel with two buttons horizontally
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT,10,10));
        buttonPanel.add(startButton);
        buttonPanel.add(stopButton);
        this.setLayout(new BoxLayout(pane,BoxLayout.Y_AXIS));
        this.add(rectangle);
        this.add(buttonPanel);

        //Sim();
        t = new TMap();
        test();
        //pane.add(rectangle);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public void addRectangle(int px, int py, int pw, int ph, Color pc, String state) {
        this.rectangle.addRectangle( px, py, pw, ph, pc, state);
    }

    public void Sim() {
        addRectangle(20,20,10,10,Color.green,"new");
        /*for (int i=0;i<=nparts;i++) {
            addRectangle(200,200,50,Color.green);
        }*/
    }

    public void test() {
        // First Station Proprieties
        t.put("num",1);
        t.put("type",1);
        t.put("avg_time",5);
        t.put("posx",100);
        t.put("posy",20);
        t.put("state",0);
        // Second Station Proprieties
        t.put("num",2);
        t.put("type",2);
        t.put("avg_time",7);
        t.put("posx",200);
        t.put("posy",20);
        t.put("state",0);
        /*System.out.println("Now the tree map Keys: " + t.St.keySet());
        System.out.println("Now the tree map contain: " + t.St.values());*/
    }

    public static void main(String[] args) {

        try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                L l = new L();
                //System.out.println("Entryset: " + t.keySet());
                //System.out.println("Entryset: " + t.Station() + "\n");
            }
        });

    }

}  

DrawRectangle.java

 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.geom.*;
 import java.util.ArrayList;
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.swing.*;

 public class DrawRectangle extends JPanel implements ActionListener {

private java.util.List<Rectangle2D> squares;
private java.util.List<Color> colors;
private long seconds = 1;
private int anim_interval = (int) TimeUnit.SECONDS.toMillis(seconds);
private Timer sim_timer;
private Timer idle_timer;
int px = 10, velx = 2;
String state;
Color pc;


public DrawRectangle(){
    //this.setBounds(10, 10, 10, 10);
    this.setMinimumSize(new Dimension(100,100));
    this.setPreferredSize(new Dimension(100,L.bgh));
    this.setMinimumSize(new Dimension(500,L.bgh));
    setBackground(Color.gray);
    setDoubleBuffered(true);
    setBorder(BorderFactory.createLineBorder(Color.black, 1));
    squares = new ArrayList<Rectangle2D>();
    colors = new ArrayList<Color>();
    sim_timer = new Timer(anim_interval,this);        
    sim_timer.start();
}

public void addRectangle(int px, int py, int pw, int ph, Color pc, String state)  { // square
    squares.add( new Rectangle2D.Double(px, py, pw, ph) ) ;
    pc = pc;
    //System.out.println(state);
    //this.a = a;
    //this.startX = startX;
    //this.startY = startY;
}

public void actionPerformed(ActionEvent e) {
    /*if (px < 0 || px > 990) {
        velx = -velx;
    }*/
    //System.out.println(px);
    if (px == 20) { 
        sim_timer.stop();
        state = "idle";
        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
            Logger.getLogger(DrawRectangle.class.getName()).log(Level.SEVERE, null, ex);
        }
        sim_timer.start();
        state = "going";
    } 
    else if (px == 50) {
        sim_timer.stop();
        state = "done";
        seconds = 2;
    }
    //if (state != "idle") {
        px = px + velx;
        repaint();
    //}
}

private void idlestate() throws InterruptedException {
    Thread.sleep(5000);
    state = "idle";
}
private void goingstate() {
    state = "going";
}
private void donestate() {
    state = "done";
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g1 = (Graphics2D) g.create();
    Graphics2D g2 = (Graphics2D) g.create();
    //System.out.println("D1");
    /*for( Rectangle2D rect : squares ) {
        System.out.println(colors);
        //g1.setPaint(colors);
        g1.fill(rect);
    }*/
    //for(int i=0;i<squares.size();i++) {
        //System.out.println("D2");
        //g1.setColor(colors.get(i));
        if (state == "going") { g1.setColor(Color.orange); }
        else if (state == "idle") { g1.setColor(Color.yellow); }
        else if (state == "done") { g1.setColor(Color.green); }
        else { g1.setColor(Color.red); }
        //g1.fill(squares.get(i));
        g1.fillRect(px, 10, 10, 10);
        g2.setColor(Color.blue);
        g2.fillRect(px,40,10,10);
        //g1.dispose();
    //}
}
 public void setColor(Color newColor) {
  pc = newColor;
      }

 }

TMap.java

import java.util.*;

public class TMap {
public TreeMap <String, Integer> St;
public int num_atrib = 6;

public TMap () {
    St = new TreeMap <>();
}
public Set<String> getKeySet() {
    return St.keySet();
}

public Integer get(String s) {
    return St.get(s);
}

public void put (String s, int i) {
    St.put(s,i);
    System.out.println("Now the tree map Keys: " + St.keySet());
    System.out.println("Now the tree map contain: " + St.values());
}

public TreeMap<String, Integer> Station(String s,int i) {
 }
 }

DrawRectangle.java コードは、コードをコンパイルしたいが、これまでのところ実際の問題とは何の関係もない人のためだけに用意されています。TMap.java は、マップを作成する場所であり、データを処理するメソッドがあります。すべてが正常に機能しています。私の問題は次のとおりです。

ほとんどの場合、シミュレートするときは複数のステーションがあるため、次のような情報を保存する必要があります。

 Station[num][type][avg_time][posx][posy][state]
 Station[1][1][5][100][20][0]
 Station[2][2][7][200][20][0]
 Station[3][3][4][300][20][0]

つまり、新しいデータをツリーマップに配置すると、保存されていた以前のデータが上書きされるため、情報を 2 回追加すると、出力は次のようになります。

 Now the tree map Keys: [avg_time, num, posx, posy, type]
 Now the tree map contain: [5, 1, 100, 20, 1]
 Now the tree map Keys: [avg_time, num, posx, posy, state, type]
 Now the tree map contain: [7, 2, 200, 20, 0, 2]

シミュレーションは 6 つの作業ステーションに制限されるので、私の質問は、これに対処するためのベスト プラクティスは何ですか? 私が思いついた唯一のことは、6 つの TreeMap を作成し、必要なものだけを使用することですが、データを保存するためのより簡単で効率的な方法が必要であると確信しています。

よろしくお願いします。

4

1 に答える 1

1

あなたが達成しようとしていることを理解しているかどうかはわかりませんが、これがマップの仕組みです。キーと値のペアを保存し、キーが一意であることを確認します。

だからあなたが書くとき:

map.put("abc",100);
map.put("abc",200);

マップには、2 行目以降にキー = "abc" および値 = 200 の 1 つのエントリしかありません。

代わりにステーションをリストに保存することをお勧めします。各ステーションは、関連情報を保持するキーと値のペアのマップです。

List<TMap> stations = new ArrayList<TMap> ();

TMap station1 = new TMap();
station1.put("num",1);
station1.put("type",1);
...
stations.add(station1);

TMap station2 = new TMap();
station2.put("num",2);
station2.put("type",2);
...
stations.add(station2);

TMapps:本当に TreeMap であるそのクラスを持つことのポイントを理解しているかどうかはわかりません。したがって、マップのリストを使用することもできます。

List<Map<String, Integer>> stations = new ArrayList<Map<String, Integer>> ();
Map<String, Integer> station1 = new TreeMap<String, Integer> ();
于 2012-07-13T15:30:06.520 に答える