如何退出我的主要方法?
How to quit my main method?
这是我的主要 method.I 有一个 ArrayList 用于食草动物和我的植物,canvas 大小为 (1000 x 1000) 我让它们做的是:
所有食草动物都吃离它们最近的植物。
我知道需要做的是一旦所有的植物都被吃掉,他们的主要方法应该退出并打印一些统计数据。我的理解是我需要在我的 Herbivores 开始寻找下一个植物之前退出,因为它会给我一个错误,因为 arrayList 现在是空的。但是,如果我在 findNearestWithinFiftyMeters 方法之前使用 "System.exit(0);",那么它将执行我的其余代码。如何让它退出但仍打印我的统计信息?
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
当有食草动物和植物时,您可以将 while 循环更改为仅 运行。
while(theHerbivores.size() > 0 && thePlants.size() > 0){
关键是 不是 退出您的 main
方法,而是退出进食动作的循环以打印一些统计数据。一个好的方法是改变你的循环条件,以便它在不需要时终止:
while(theHerbivores.size() > 0 && thePlants.size() > 0) {
//Rest of code....
}
这将导致在外部循环之后执行其余代码。
作为您问题的补充,您可以在需要时使用 break
语句跳出循环,通常与循环内的条件 if/else if/else
语句结合使用。 System.exit(0)
将导致您的程序终止的实际力量,如前所述,不是您想要的情况。
嗯,据我了解,您正试图在 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
}
这是我的主要 method.I 有一个 ArrayList 用于食草动物和我的植物,canvas 大小为 (1000 x 1000) 我让它们做的是: 所有食草动物都吃离它们最近的植物。 我知道需要做的是一旦所有的植物都被吃掉,他们的主要方法应该退出并打印一些统计数据。我的理解是我需要在我的 Herbivores 开始寻找下一个植物之前退出,因为它会给我一个错误,因为 arrayList 现在是空的。但是,如果我在 findNearestWithinFiftyMeters 方法之前使用 "System.exit(0);",那么它将执行我的其余代码。如何让它退出但仍打印我的统计信息?
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
当有食草动物和植物时,您可以将 while 循环更改为仅 运行。
while(theHerbivores.size() > 0 && thePlants.size() > 0){
关键是 不是 退出您的 main
方法,而是退出进食动作的循环以打印一些统计数据。一个好的方法是改变你的循环条件,以便它在不需要时终止:
while(theHerbivores.size() > 0 && thePlants.size() > 0) {
//Rest of code....
}
这将导致在外部循环之后执行其余代码。
作为您问题的补充,您可以在需要时使用 break
语句跳出循环,通常与循环内的条件 if/else if/else
语句结合使用。 System.exit(0)
将导致您的程序终止的实际力量,如前所述,不是您想要的情况。
嗯,据我了解,您正试图在 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
}