2016-11-10 148 views
3

我正在为类的东西工作,我卡住了。我相信我很接近,但不知道该去哪里。当我运行我的代码时,我需要十次使用我的数组,这必须与我的循环有关。另外,在我的数组中,我不知道如何创建20-50的范围。目前我的是从1-50。最后,我的输出不完全是需要的。任何帮助将不胜感激。以下是我的代码到目前为止的问题。Java随机数组

创建一个名为array1的数组,其中包含[20 50]范围内的10个随机整数。然后创建一个名为array2的数组,其大小与array1相同。然后将array1中大于35的数字复制到array2。如果没有足够的数字复制到数组2中,则在数组2中填充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)); 
     } 
    } 
} 
+0

'for-loop'后面打印,不在里面。 – bradimus

+0

想想你是如何复制array2中的值的。如果第一个数字> 35位于索引5,那么应该将它放在数组2中?你的代码现在放在哪里? – Stefan

回答

3

计算你想要然后添加初始值的范围之间的随机数:

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

而且你有for循环内的打印打印多次。您应该移动这些行:

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

以外的for循环。

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

+0

谢谢锆石。有一天,我希望你和你一样好! – user1729377

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

这差不多完美了。我只需要将零移到数组二的后面。有任何想法吗?? – user1729377

+0

哦,你想把零移到后面?那么这将是一个不同的问题。但是你必须再次检查数组,并创建一个新的数组,其中所有元素等于0,检查排序后的数组是否为数字,如果不是0,则将其添加到新数组中,否则跳过。这会让你想要的阵列。 – BlackHatSamurai

2

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

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

我喜欢这个解决方案,但我不认为OP可以在没有解释的情况下在作业中使用类似的东西。 – DejaVuSansMono

1

以前的答案对于Random和println()方法是正确的。 我只想补充奇特的方式如何在array1填充数组2中java8 :) 相反的:

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 :) 
+0

不错的java8实现,但是请求是array2必须在最后有零。 – user6904265

+0

好吧,我改变了一点:)好点:) –

+0

好吧,现在它工作作为OP请求 – 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));