在数组中搜索值但只打印第一个实例[更新]

时间:2015-04-08 09:25:59

标签: java arrays loops conditional-statements

我正在制作赛马计划,将打印第1和第3位马匹。我必须在阵列中设置10匹马,然后将1-3中的随机数添加到它们的位置。获胜者是第一匹15或以上的马。

我的问题是我的程序没有正确打印第二和第三匹马。

[更新]我删除了许多条件并添加了字符串变量来存储信息。它运行得更顺畅但现在我不知道为什么程序会不断打印重复等等。

以下是代码,我更新了打印获胜者的for循环:

import java.util.*;
public class HorseRace{
  public static void main(String[ ] arg){
   Scanner reader = new Scanner(System.in);
   int range = 3;
   int win = 15;
   final int SIZE = 5;
   Random ran = new Random( );
   boolean winner = false;
   boolean second = false;
   int[ ] arrRan = new int[SIZE];

    System.out.print("Off to the races! Press enter to make the horses run.");

    String readString = reader.nextLine();
    while(winner!=true){//loop forever until winner
    //begin program
      System.out.print(readString);
      if(readString.equals("")){//when enter is pressed

         for(int i = 0; i<arrRan.length; i++){//loop that adds position when enter is pressed
            arrRan[i] = arrRan[i] + (ran.nextInt(3) + 1); //add to the array in random numbers
            System.out.println("Horse " + (i+1) + ": " + arrRan[i]);//print the contents of the array
         }       
      }//end if
      if(reader.hasNextLine()){
         readString = reader.nextLine();
         System.out.println("Please press enter.");
      }
  for(int i = 0; i<arrRan.length; i++){
     if(arrRan[i]>=15){//if a winner is found
        first = first + "Horse " + (i+1)+" ";
        winner = true;

     }

     //if winner is found then look for a 2nd place
     //if there is no position 14 then search for 13, if no 13 then 12. The lowest 2nd place will be in position 12. 
     if(arrRan[i]==14){
        second = second + "Horse " + (i+1)+" ";
        secondPl = true;

     }
     if(arrRan[i]!=14&&arrRan[i]==13){
        second = second + "Horse " + (i+1)+" ";
        secondPl = true;  
     }
     if(arrRan[i]!=13&&arrRan[i]==12){
        second = second + "Horse " + (i+1)+" ";
        secondPl = true;  
     }
     if(arrRan[i]==13){
        third = third + "Horse " + (i+1)+" "; 
     }         
  }
  if(winner==true){
  System.out.println(first);
  System.out.println(second);
  System.out.println(third);
  }      

    }//end while
   }//close main
}//close class

4 个答案:

答案 0 :(得分:1)

您可以使用for语句退出break循环。

答案 1 :(得分:0)

你可以通过循环所有马匹并在飞行中保存最好的马匹来搜索三匹最好的马匹。之后打印结果。

三匹最佳马匹的数量有三个变量,三匹最佳马匹的距离有三个变量。

在循环中,你检查你当前正在看的马是否比第一匹,第二匹或第三匹马更好。然后将它插入相应的位置并将其他马向下移动。

最后,你会得到三匹最好的马匹,并且可以一个接一个地打印出来。

向下移动可以实现迈克:

int horse1, horse2, horse3, d1, d2, d3;

// Do something...

horse3 = horse2;
d3 = d2;
horse2 = horseNew;
d2 = dNew;

在第一和第三位插入时,你应该能够找出变化。

答案 2 :(得分:0)

您可以使用以下方法代替您从第一到第三位检查获胜者的for循环:因此,如果有胜利者,则会出现while循环。

  winner = checkAndPrintWinner(arrRan);

然后为了找到获胜者本身,下面的代码会进行排序以查看是否有胜利者,如果有,它会跟踪最后一个值,以便它可以追加或添加到{{1中的新元素数组。随意以不同的方式打印结果。代码可以进一步优化。

winners

答案 3 :(得分:0)

你的逻辑似乎有许多缺陷。

  • while循环似乎没有结束
  • 首先达到14可能不是第一个
  • 要达到15,所以你应该确保没有重复的值 目前在第一,第二和第三,
  • 一旦设置不应再次设置
  • 虽然找到所有三个循环,但循环应该会中断。

使用break语句退出循环

更新: 让我们假设,horse1是唯一一个达到或超过13的人。在这种情况下, 1.在任何迭代中,Horse1 = 13,然后first = null,second = Horse1,third = Horse1 2. Horse1 = 14,first = null,second = Horse1,third = horse1 3. Horse1 = 15,first = horse1,second = Horse1,third = Horse1

在上面的例子中,没有变量被重新设置为另一个值,因为没有其他马达到12或更高的值

因此,重复的可能性 如果我做对了,请告诉我

for(int i = 0; i<arrRan.length; i++){
     if(arrRan[i]>=15){//if a winner is found
        first = first + "Horse " + (i+1)+" ";
        winner = true;

     }

     //if winner is found then look for a 2nd place
     //if there is no position 14 then search for 13, if no 13 then 12. The lowest 2nd place will be in position 12. 
     if(arrRan[i]==14){
        second = second + "Horse " + (i+1)+" ";
        secondPl = true;

     }
     if(arrRan[i]!=14&&arrRan[i]==13){
        second = second + "Horse " + (i+1)+" ";
        secondPl = true;  
     }
     if(arrRan[i]!=13&&arrRan[i]==12){
        second = second + "Horse " + (i+1)+" ";
        secondPl = true;  
     }
     if(arrRan[i]==13){
        third = third + "Horse " + (i+1)+" "; 
     }         
  }