[英]Using int[] arrays to manipulate each other through nested loops
我想做的是使用一種方法從0-15生成30個隨機數,然后使用另一種方法計算每個數字打印多少次並將其放入第二個數組中。 第二個數組中的每個位置都對應於它所在的數組中的數字。 如果i = [0]並且0出現3次,則應該為3,依此類推。
到目前為止,我已經明白了。 似乎正在發生的事情是,它計算15出現的次數(數組的最后一個數字)。 雖然我可能是錯的。 我看不到我在做什么錯。 我的邏輯肯定有問題。
import java.util.Arrays;
public class FrequencyOfNumbers {
public static void main(String[]args){
System.out.println(Arrays.toString(randomNums()));
System.out.println(Arrays.toString(sortedNums(randomNums())));
}
public static int[] randomNums (){
int[] random = new int[30];
for(int i=0;i<random.length;i++){
double randNum = Math.random() * 16;
random[i] = (int)randNum;
}
return random;
}
public static int[] sortedNums(int[] sort){
int[] numVals = new int[15];
for(int i=0;i<numVals.length;i++)
{
for(int j=0;j<sort.length;j++)
{
if(sort[j] == numVals[i])
{
numVals[i]++;
}
}
}
return numVals;
}
}
我收到的示例輸出:
[5, 15, 0, 5, 4, 10, 4, 11, 5, 13, 13, 8, 9, 9, 10, 6, 0, 9, 10, 12, 3, 7, 4, 9, 4, 11, 9, 15, 10, 7]
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
要計算集合中對象的實例數,可以使用Collections.frequency()
:
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < sort.length; i++) {
list.add(sort[i]);
}
for(int i = 0; i< numVals.length;i++){
numVals[i] = Collections.frequency(list, i);
}
return numVals;
您在代碼中有一些問題:
不要兩次調用randomNums()
。 否則,您將無法計算正確的頻率。 它將生成不同的數組。
如果要將數字保持在0到15之間,則應為numVals
分配16個元素。
計算外觀時,不需要內部for
循環。 只要考慮所有數字,取它們的值,然后增加出現次數。
嘗試這個:
public static void main(String[] args) {
int[] randomNumbers = randomNums();
System.out.println(Arrays.toString(randomNumbers));
System.out.println(Arrays.toString(sortedNums(randomNumbers)));
}
public static int[] randomNums() {
int[] random = new int[30];
for (int i = 0; i < random.length; i++) {
random[i] = (int) (Math.random() * 16);
}
return random;
}
public static int[] sortedNums(int[] sort) {
int[] numVals = new int[16];
for (int j = 0; j < sort.length; j++) {
numVals[sort[j]]++;
}
return numVals;
}
可能的輸出:
[8, 6, 5, 12, 12, 9, 15, 6, 7, 9, 15, 3, 6, 7, 3, 8, 6, 3, 15, 8, 12, 4, 7, 12, 2, 15, 6, 5, 4, 5]
[0, 0, 1, 3, 2, 3, 5, 3, 3, 2, 0, 0, 4, 0, 0, 4]
性能
如果要(實際)計算比較次數,可以:
在您的班級中創建一個新成員:
static int steps = 0;
定義一個增加計數器的新方法:
private static boolean f() { steps++; return true; }
在if
,在當前條件之前添加f() &&
。
在main
方法中添加以下最后一行:
System.out.println(steps);
僅使用一個for
你會產生30
步。
使用2 for
循環(如您在注釋中所寫)將生成480
步( 480 = 30 * 16
)。
在這種情況下無關緊要,因為兩個操作都非常快。 但是對於較大的輸入,如果第一種方法花費1秒,則應注意第二種方法是否花費10秒以上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.