2016-11-10 98 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));