【问题标题】:Java While Loop & 1D ArrayJava While 循环和一维数组
【发布时间】:2017-03-06 20:52:50
【问题描述】:

我创建了一个名为 teams 的字符串数组和一个名为 nums 的 int 数组。 num 数组中的每个整数对应于字符串数组中的一个团队。

例如:

蒙特利尔加拿大人队 = 1,芝加哥黑鹰队 = 2,等等。

我需要从 1-10 中随机选择数字(对应于 int[] num),并且这个循环必须继续,直到整数数组中的每个元素都被调用一次。这意味着在循环结束时,字符串数组中的每个团队都会被调用一次。这必须通过一个while循环来完成。我似乎无法弄清楚如何准确地创建一个可以做到这一点的循环。

import java.util.Scanner;

public class Question1 {

    public static void main(String[] args) {

//declare scanner
        Scanner keyboard= new Scanner (System.in);  


//display opening message 
        System.out.println("= 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 =");
        System.out.println("= 0                                                       0 =");
        System.out.println("= 0       NHL Miniature Hockey Puck Vending Machine       0 =");
        System.out.println("= 0                                                       0 =");
        System.out.println("= 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 =");
        System.out.println("");
        System.out.println("");
        System.out.println("Hello, what is your first name? ");

//read user input 
        String name = keyboard.nextLine();

//Welcome message 
        System.out.println("Welcome " + name + "! Let's see how much money you will need to spend to get all of the pucks.");

//declaring 10 teams in a 1D array 
    String[] teams = {"Montreal Canadiens","Chicago Blackhawks","Boston Bruins","Toronto Maple Leafs","Vancouver Canucks","Ottawa Senators","Pittsburgh Penguins","Calgary Flames","New York Rangers","Edmonton Oilers"};   

int[] nums = {1,2,3,4,5,6,7,8,9,10};

//random number from 1-10
while (
        int RandomNum = (int)(Math.random()*10)+1;

【问题讨论】:

  • 别忘了打电话给keyboard.close(); :-)

标签: java arrays


【解决方案1】:

改用列表/向量...

那么你就不再需要随机数了,只需要打乱列表

List<String> teams = new Vector<>(Arrays.asList("Montreal Canadiens", "Chicago Blackhawks", "Boston Bruins",
    "Toronto Maple Leafs", "Vancouver Canucks", "Ottawa Senators", "Pittsburgh Penguins", "Calgary Flames",
    "New York Rangers", "Edmonton Oilers"));
int ts = teams.size();
for (int i = 0; i < ts; i++) {
    System.out.println(teams.remove(0));
    Collections.shuffle(teams);
}

【讨论】:

  • 同一个团队是否有可能被多次打印,因此其他人根本不会?
【解决方案2】:

这个:

List<String> teamsList = new ArrayList<String>(Arrays.asList(teams));
while(!teamsList.isEmpty()){
    int randomNum = (int)(Math.random()*teamsList.size());
    String team = teamsList.remove(randomNum);
}

或者:

List<String> teamsList = new ArrayList<String>(Arrays.asList(teams));
Collections.shuffle(teamsList);
while(!teamsList.isEmpty()){
    String team = teamsList.remove(0);
}

编辑1: 如果您不想要团队名称,而是团队编号,只需替换teams -> nums。

编辑2:

导入这些类:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

【讨论】:

  • 感谢您的宝贵时间。当我尝试使用您的建议时,第一行出现多个错误 (list....)“ArrayList 无法解析为变量”、“List 无法解析为变量”、“数组无法解决”
  • 欢迎您 =) 必须为这些类添加导入(请参阅我更新的帖子)
【解决方案3】:

首先,如果您希望nums 中的值与teams 中的值相对应,您将希望这些值从 0 开始并以 9 结束,这样数字对应球队的指数。

如果您想手动执行此操作,我建议您使用循环将随机选择的值移到前面,如下所示:

int i = 0;
while(i<nums.length){
    int randomIndex = i + (int)Math.random*(nums.length-i);
    int temp = nums[i];
    nums[i] = nums[randomIndex];
    nums[randomIndex] = temp;
    i++
}

然后,您可以再次循环遍历列表,循环遍历的值将是(伪)随机的 1-10。然后,您可以根据需要对列表进行排序。

【讨论】:

    【解决方案4】:

    你可以打乱你的数组,然后用while循环一个接一个地去。

    看看这个解决方案https://stackoverflow.com/a/1520212/814304(只需使用while循环而不是for循环);

    【讨论】:

      【解决方案5】:

      如果您的 nums 数组中的数字应该是索引,我猜,任何其他答案都可以正常工作。一方面,我确实将您的问题解释为您的数字应该是这样的,也可能是任何其他数字。

      在这种情况下,我将创建一个Team 类,如下所示。

      团队

      public class Team {
          private static final String DELIMITER = " / ";
      
          private String name;
          private int number;
      
          public Team(String name, int number) {
              this.name = name;
              this.number = number;
          }
      
          public String getName(){
              return this.name;
          }
      
          public int getNumber(){
              return this.number;
          }
      
          @Override
          public String toString(){
              return this.getName() + DELIMITER + this.getNumber();
          }
      }
      

      主要

      import java.util.ArrayList;
      import java.util.List;
      import java.util.Scanner;
      
      public class Main {
          public static void main(String[] args) {
      
              // declare scanner
              Scanner keyboard = new Scanner(System.in);
      
              // display opening message
              System.out.println("= 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 =");
              System.out.println("= 0                                                       0 =");
              System.out.println("= 0       NHL Miniature Hockey Puck Vending Machine       0 =");
              System.out.println("= 0                                                       0 =");
              System.out.println("= 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 =");
              System.out.println("");
              System.out.println("");
              System.out.println("Hello, what is your first name? ");
      
              // read user input
              String name = keyboard.nextLine();
      
              // Welcome message
              System.out.println("Welcome " + name + "! Let's see how much money you will need to spend to get all of the pucks.");
      
              List<Team> teams = new ArrayList<>();
              teams.add(new Team("Montreal Canadiens", 1));
              teams.add(new Team("Chicago Blackhawks", 2));
              teams.add(new Team("Boston Bruins", 3));
              teams.add(new Team("Toronto Maple Leafs", 4));
              teams.add(new Team("Vancouver Canucks", 5));
              teams.add(new Team("Ottawa Senators", 6));
              teams.add(new Team("Pittsburgh Penguins", 7));
              teams.add(new Team("Calgary Flames", 8));
              teams.add(new Team("New York Rangers", 9));
              teams.add(new Team("Edmonton Oilers", 10));
      
              List<Team> visitedTeams = new ArrayList<>();
      
              while (teams.size() > visitedTeams .size()) {
                  int randomNum = (int) (Math.random() * teams.size());
                  Team team = teams.get(randomNum);
      
                  if (!visitedTeams.contains(team)) {
                      visitedTeams.add(team);
                  }
              }
      
              // Close your scanner
              keyboard.close();
      
              System.out.println("Teams called: ");
              visitedTeams.forEach(System.out::println);
          }
      }
      

      注意关闭了键盘,您也可以在阅读用户名后执行此操作。另外,我不会从列表中删除团队,因为我可以想象您希望保留它们以供进一步处理。

      输出

      = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 =
      = 0                                                       0 =
      = 0       NHL Miniature Hockey Puck Vending Machine       0 =
      = 0                                                       0 =
      = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 = 0 =
      
      
      Hello, what is your first name? 
      MyName
      Welcome MyName! Let's see how much money you will need to spend to get all of the pucks.
      Teams called: 
      Chicago Blackhawks / 2
      Toronto Maple Leafs / 4
      Edmonton Oilers / 10
      Boston Bruins / 3
      Ottawa Senators / 6
      Calgary Flames / 8
      Vancouver Canucks / 5
      Pittsburgh Penguins / 7
      Montreal Canadiens / 1
      New York Rangers / 9
      

      【讨论】:

        【解决方案6】:

        这里有 30 支 NHL(国家冰球联盟)的冰球队。一些商店有自动售货机,每个售卖迷你曲棍球冰球的价格为 1 美元(2 美元)。当你放入一个玩具时,你永远不知道你会得到哪个冰球; 30 个团队冰球中的任何一个都与其他任何一个球一样可能被机器分配。它们是随机分发的。 对于本练习,我们将团队限制为 10 个。 你的工作是编写一个程序来模拟 NHL 微型冰球的分发,直到每 10 个微型团队冰球分发一个。 您的程序应按如下方式进行: 1. 显示欢迎信息并要求用户输入他们的姓名。 2. 将你最喜欢的 10 个曲棍球队的名字存储在一个字符串数组中。分配团队名称 直接声明声明。 3.你的程序应该循环(使用while循环)直到每队至少有一个小冰球 已分发。创建一个大小为 10 的整数数组,该数组将用作计数器数组,以跟踪自动售货机分发的每个团队冰球的数量。您将需要使用 Math.random() 函数来随机分配一个微型冰球。 Math.random() 方法返回一个带正号的双精度值,大于或等于 0.0 且小于 1.0。 4. 每个冰球至少累积一个后,在个性化消息中显示您必须购买的每个团队冰球的数量、购买的冰球总数和总费用

        1 - 一维数组和 while 循环

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-28
          • 1970-01-01
          • 1970-01-01
          • 2021-07-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-05
          • 1970-01-01
          相关资源
          最近更新 更多