【问题标题】:How to quit my main method?如何退出我的主要方法?
【发布时间】:2015-05-03 13:39:47
【问题描述】:

这是我的主要方法。我在 (1000 x 1000) 的画布尺寸中为食草动物和我的植物提供了一个 ArrayList 我让它们做的是: 所有的食草动物都吃离它们最近的植物。 我知道需要做的是一旦所有的植物都被吃掉了,他们的主要方法应该退出并打印一些统计数据。我的理解是我需要在我的 Herbivores 开始寻找下一个植物之前退出,因为它会给我一个错误,因为 arrayList 现在是空的。但是,如果我使用“System.exit(0);”在我的 findNearestWithinFiftyMeters 方法之前,它将执行我的其余代码。如何让它退出但仍打印我的统计信息?

import java.util.ArrayList;

public class TestDriver {
    public static void main(String[] args){
        //Set the canvas size to (1000,1000) and x and y scale to (0,1000)
        StdDraw.setCanvasSize(1000,1000);
        StdDraw.setXscale(0.0 , 1000.0);
        StdDraw.setYscale(0.0 , 1000.0);

        //ArrayList for the Plants
        ArrayList<Plant> thePlants = new ArrayList<Plant>();
        //Create 300 Plants

        for (int i=0; i<300; i++){
            thePlants.add(new Plant (1000 * Math.random(),1000 * Math.random()));
        }



        //ArrayList for the Herbivores
        ArrayList<Herbivore> theHerbivores = new ArrayList<Herbivore>();
        //Create 20 Herbivores
        for (int i=0; i<20; i++){
            theHerbivores.add(new Herbivore (1000 * Math.random(), 1000 * Math.random()));
        }

        //Draw Graphics:
        while(theHerbivores.size() > 0){
            //Clears the board
            StdDraw.clear();

            //created Herbivores of size
            for(int i=0; i<theHerbivores.size(); i++){  
                //Draws the herbivore at position i
                theHerbivores.get(i).draw();

                if(thePlants.size() == 0){
                 StdDraw.clear();
                }

                //Finds the plant that is closest to the herbivore
                Plant closest = findNearestWithinFiftyMeters(thePlants , theHerbivores.get(i));
                if(closest != null){
                    //IF the closest plant is NOT null then move towards closest plant
                    theHerbivores.get(i).moveToward(closest.getX(), closest.getY() );
                    //now that we have the closest plant in regards to this herbivore
                    //we want it to move to the plant
                    theHerbivores.get(i).createRandomTarget();
                    //Reset the target each time it finds a new plant to chew
                }
                else{
                    //if it IS null
                    //Walk in a random direction (towards the imaginary plant)
                    theHerbivores.get(i).move();
                }
            }

            //Draws plants
            for(Plant p: thePlants){
                p.draw();
            }

            //Check for any herbivores that have moved off screen
            for(int i=0; i < theHerbivores.size(); i++){
                //if an herbivore moved too far left or right move to other side of screen
                if(theHerbivores.get(i).getX()>1000){
                    theHerbivores.get(i).setX(0);
                }
                else if(theHerbivores.get(i).getX()<0){
                    theHerbivores.get(i).setX(1000);
                }               
                //if an herbivore moved too far up or down
                if(theHerbivores.get(i).getY()>1000){
                    theHerbivores.get(i).setY(0);
                }
                else if(theHerbivores.get(i).getY()<0){
                    theHerbivores.get(i).setY(1000);
                }
            }


            //looping through all the plants to remove plants that have been eaten
            for(int i=0; i< theHerbivores.size(); i++){
                for(int j = 0; j < thePlants.size(); j++){
                    if(thePlants.get(j).distanceTo(theHerbivores.get(i).getX(),theHerbivores.get(i).getY()) < 3){

                        thePlants.remove(j);

                        theHerbivores.get(i).eat();
                        //INCREMENT HERBIVORE EATEN COUNT
                    }
                }
                StdDraw.show(1);

            }
            stepCounter++;
        }//end while loop

        System.out.println(stepCounter + " steps done in this simulation");
        long estimatedTime = System.nanoTime() - startTime;
        System.out.println(estimatedTime + "Length of time simulation used" );
        for(int i=0; i<theHerbivores.size(); i++){
            System.out.println("Herbivore # " + i + "X: " + theHerbivores.get(i).getX() + "Y: " + theHerbivores.get(i).getY() + " EATEN: "+ theHerbivores.get(i).getEatCount());
        }

        return;
    } // end of main method


    static long startTime = System.nanoTime(); 
    static int stepCounter = 0;

    public static Plant findNearestWithinFiftyMeters(ArrayList<Plant> thePlants , Herbivore eater){
        //plant variable for storage to find closest plant to that herbivore
        Plant closest = thePlants.get(0);
        for(int i=0; i<thePlants.size(); i++){
            if(eater.distanceTo(closest.getX(), closest.getY()) > eater.distanceTo(thePlants.get(i).getX(),thePlants.get(i).getY()) ){
                //if the plant in closest variable is farther away than the 
                //plant in index 'i' then replace the plant in closest with the plant in index 'i'
                closest = thePlants.get(i);
            }
        }

        if(eater.distanceTo(closest.getX(),closest.getY()) > 50){
            //if distance is greater than 50(herbivore sight range) then set closest equal to null
            closest=null;
        }
        return closest;
    }   
} // end of class

【问题讨论】:

    标签: java methods arraylist main


    【解决方案1】:

    您可以将 while 循环更改为仅在有食草动物和植物时运行。

    while(theHerbivores.size() > 0 && thePlants.size() > 0){
    

    【讨论】:

      【解决方案2】:

      重点是不是退出你的main 方法,而是退出吃动作的循环以便打印一些统计数据。一个很好的方法是改变你的循环条件,让它在不需要时终止:

      while(theHerbivores.size() > 0 && thePlants.size() > 0) {
       //Rest of code....
      }
      

      这将导致在外循环之后执行其余代码。

      作为对您问题的补充,您可以在需要时使用break 语句退出循环,通常与循环内的条件if/else if/else 语句结合使用。 System.exit(0) 将导致您的程序终止的实际力量,这不是您想要的情况,如上所述。

      【讨论】:

      • 谢谢!这很有意义!
      • 不客气。如果您认为答案是最佳答案,请考虑将其投票为最佳答案,或者在可能的情况下投票。
      【解决方案3】:

      嗯,据我了解,您试图在 main 方法结束后打印一些信息,而不终止整个程序。如果这是正确的,您应该只创建一个打印这些统计信息的方法。然后在main方法的最后调用这个方法。这样,main 方法在调用此方法后结束,但程序继续运行,直到打印统计信息。

      这是一个例子:

      public static void main(String[] args) {
          //everything in the main method
          //the end of the main method
          printStatistics();
          //main method terminates here but the program runs until the printStatistics() method finishes running
      }
      
      private void pintStatistics() {
          System.out.println(/*insert statistics here*/);
          //entire program terminates here
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-16
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2011-03-19
        • 2017-06-13
        • 1970-01-01
        相关资源
        最近更新 更多