【问题标题】:Java Random ArraysJava 随机数组
【发布时间】:2016-11-11 15:48:22
【问题描述】:

我正在为上课做一些事情,但我被困住了。我相信我很近,但不知道去哪里。当我运行我的代码时,我得到了十次数组,这一定与我的循环有关。另外,在我的数组中,我不确定如何创建 20-50 的范围。目前我的是1-50。最后,我的输出并不完全是需要的。任何帮助将不胜感激。这是问题,后面是我的代码。

创建一个名为 array1 的数组,其中包含 [20 50] 范围内的 10 个随机整数。然后创建一个与array1 大小相同的名为array2 的数组。然后将array1中大于35的数字复制到array2中。如果没有足够的数字复制到它,则在 array2 中填充 0。例如,如果 array1 是 {34, 23 45, 39, 28, 41, 33, 23, 42, 48},则 array2 将是 {45, 39, 41, 42, 48, 0,0,0,0,0 }

import java.util.Random;
import java.util.Scanner;
import java.util.Arrays;

public class Arraylab6 {
    public static void main(String[] args) {
        int x;
        int[] array1 = new int[10];
        int[] array2 = new int[10];
        Random rand = new Random();
        for (int i = 0; i < array1.length; i++) {
            int h = rand.nextInt(50);
            array1[i] = h;
        }
        System.out.println(Arrays.toString(array1));
        for (int i = 0; i < array1.length; i++) {
            if (array1[i] > 35) {
                array2[i] = array1[i];
            } else {
                array2[i] = 0;
            }
            System.out.println(Arrays.toString(array1));
            System.out.println(Arrays.toString(array2));
        }
    }
}

【问题讨论】:

  • for-loop之后打印,而不是在里面。
  • 想想你是如何复制array2中的值的。如果第一个数字 >35 在索引 5 处,您应该将它放在 array2 的哪个位置?你的代码现在把它放在哪里?

标签: java arrays


【解决方案1】:

我不确定如何创建 20-50 的范围。目前我的是1-50。

int h = rand.nextInt(31)+20; //nextInt(31) = range from 0-30, then add 20 to the result

当我运行我的代码时,我得到我的数组十次

您的println 呼叫在您的for 循环中,将它们向下移动。

此外,您的解决方案不满足要求,因为您将任何 >35 的数字放入与另一个数组相同的索引中。相反,请跟踪您的插入索引,并在复制 int 时移动它:

int copyIndex = 0;
for (int i = 0; i< array1.length; i++)
{
  if (array1[i]>35){
    array2[copyIndex++]=array1[i]; //Add 1 to copyIndex each time a value is copied
}

您也不需要用零“填充”,因为int 的默认值已经是0

【讨论】:

    【解决方案2】:

    在你想要的范围内计算一个随机数,然后加上起始值:

    int h = rand.nextInt(31) + 20;
    

    对于多次打印,您可以在 for 循环内进行打印。您应该移动这些行:

    System.out.println(Arrays.toString(array1));
    System.out.println(Arrays.toString(array2));
    

    for 循环之外。

    【讨论】:

      【解决方案3】:

      您有几个问题。首先,您的随机生成器应如下所示:

      int random = (int) (Math.random() * 31 + 20);
      

      其次,您需要将输出语句从最后一个 for 循环中提取出来:

         for (int i = 0; i< array1.length; i++)
         {
            if (array1[i]>35)
            {
              array2[i]=array1[i];
            }
            else {
               array2[i]=0;
            }
      
      
         }
         System.out.println(Arrays.toString(array1));
         System.out.println(Arrays.toString(array2));
       }
      }
      

      【讨论】:

      • 这几乎是完美的。我现在只需要将零移到数组 2 的后面。有什么想法吗??
      • 哦,你想把零移到后面吗?那将是一个不同的问题。但是您必须再次检查数组并创建一个所有元素都等于 0 的新数组,检查排序后的数组是否有一个数字,如果它不是 0,则将其添加到新数组中,否则跳过。这会给你留下你想要的数组。
      【解决方案4】:

      您可以使用ThreadLocalRandom 类在给定范围内生成随机数:

      ThreadLocalRandom.current().nextInt( min, max+1);
      

      【讨论】:

      • 我喜欢这个解决方案,但我不认为 OP 可以在没有任何解释的情况下在作业中使用类似的东西。
      【解决方案5】:

      另一个漂亮的实现:

      int[] array1 = new Random().ints(10, 20, 51).toArray();
      int[] temp = Arrays.stream(array1).filter(x -> x > 35).toArray();
      int[] array2 = new int[10];
      System.arraycopy( temp, 0, array2, 0, temp.length );
      System.out.println(Arrays.toString(array1));
      System.out.println(Arrays.toString(array2));
      

      【讨论】:

        【解决方案6】:

        之前关于 Random 和 println() 方法的答案是正确的。 我只想添加花哨的方式如何在 java8 中从 array1 填充 array2 :) 而不是:

        for (int i = 0; i < array1.length; i++) {
                if (array1[i] > 35) {
                    array2[i] = array1[i];
                } else {
                    array2[i] = 0;
                }
        }
        

        你可以使用这个 java 8 代码:

           int[] filtered = Arrays.stream(array1) //make a stream of array1
                .filter(value -> value > 35) //if value is greater than 35, leave that value
                .toArray(); //create array from the result
            //create array with zeroes that need to be added
            int[] zeroes = new int[array1.length - filtered.length];
            Arrays.fill(zeroes, 0);
            //concat zeroes
            array2 = ArrayUtils.addAll(filtered, zeroes); //you have your final array :)
        

        【讨论】:

        • 不错的 java8 实现,但要求 array2 最后必须有零。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        • 2014-12-29
        • 2019-03-23
        • 2016-04-15
        • 2017-04-17
        相关资源
        最近更新 更多