Java随机数组

3
我正在为课堂做一些事情,但卡住了。我相信我已经很接近了,但不知道该怎么办。当我运行我的代码时,我的数组会被输出十次,这一定与我的循环有关。另外,在我的数组中,我不确定如何从20-50创建范围。目前我的范围是1-50。最后,我的输出结果并不完全符合要求。如果能得到任何帮助,将不胜感激。以下是问题和我的代码。
创建一个名为array1的数组,其中包含10个在[20 50]范围内的随机整数。然后创建一个名为array2的数组,其大小与array1相同。然后将array1中大于35的数字复制到array2中。如果复制到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之后打印,而不是在其中。 - bradimus
想一想你是如何复制array2中的值的。如果第一个大于35的数字在索引5处,你应该把它放在array2的哪里?你的代码现在把它放在哪里了? - Stefan
6个回答

5

我不确定如何创建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

3

在您希望的范围内计算一个随机数,然后加上起始值:

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

对于多次打印,您需要将打印语句放在 for 循环之内。您应该将以下行移动:

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

for循环之外。


2

您有几个问题。首先,您的随机生成器应该像这样:

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));
 }
}

那几乎完美了。现在我只需要将数组二中的零移动到末尾。有什么想法吗? - user1729377
哦,你想把零移到后面?那就是另一个问题了。但你需要再次遍历数组,并创建一个所有元素都等于0的新数组,然后检查排序后的数组中是否有数字,如果不是0,则将其添加到新数组中,否则跳过。这样就可以得到你想要的数组。 - BlackHatSamurai

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

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

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

我喜欢这个解决方案,但我认为 OP 不能在作业中使用这样的东西而不加一些说明。 - DejaVuSansMono

1

之前的回答关于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;
        }
}

you can use this java 8 code:

   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必须在末尾有零。 - user6904265

1
另一个漂亮的实现:

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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接