我正在学习Java,我在阵列章节中找到了一个我无法解决的练习。
练习说:
编写创建名为
odds
的数组的代码,并使用for
循环将所有奇数在-6和38之间存储到其中。使数组的大小足以存储数字。
我能想出的唯一解决方案是:
import java.util.Arrays;
public class exerciseOddsArray {
public static void main(String[]args){
oddsArray();
}
public static void oddsArray(){
int odds = 0;
for (int i = -6; i <= 38; i++){
if (i % 2 == 1){
odds++;
}
}
int[] numbers = new int[odds];
for (int i = 0; i < numbers.length; i ++){
for (int j = -6; j <= 38; j++){
if(j % 2 == 1){
numbers[i] = j;
}
}
}
System.out.println(Arrays.toString(numbers));
}
}
然而,该程序打印:
[37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37]
我不明白为什么。
答案 0 :(得分:6)
这里不需要嵌套的FOR循环。只需创建一个整数变量i来跟踪数组中的位置,并在添加每个新项目时增加它。 PS ...数组应该根据赋值的规格被称为“赔率”。我建议重命名你用来计算其他东西的赔率数量的变量(例如numberOfOdds)
<div>My name: <input name="fullName" type="text"></div>
<div>My email: <input name="email" type="email"></div>
<div data-label="Friend's name"><input name="friendFn" type="text"></div>
<div data-label="Friend's email"><input name="friendEm" type="email"></div>
答案 1 :(得分:2)
对于每个i
,您可以查看所有奇数j
,并将其分配给numbers[i]
。相反,你可以(应该!)使用单个循环:
int min = -6;
int max = 38;
int numOdds = (max - min) / 2; // Ok because both min and max are even
int[] odds = new int[numOdds];
int firstOdd = min;
if (min % 2 == 0) {
++firstOdd;
}
int index = 0;
for (int i = firstOdd; i < max; i += 2) {
odds[index++] = i;
}
BTW - 我认为这是一个学校练习,并且您应该使用for
循环,但坦率地说,Java 8的流可以更简洁的方式解决这个问题:
odds = IntStream.range(-6, 38).filter(i -> i % 2 != 0).toArray();
答案 2 :(得分:0)
赔率是单个值,您需要保留列表中找到的所有奇数。
int odds = 0;
答案 3 :(得分:0)
U创建了int
值并在第一个for
循环中将其更改了22次。然后你为你的阵列添加相同的值再过百万次。尝试在第一个循环中将值添加到数组中:
int[] odds= new int[numberOfOdds];
int i = 0;
for (int j = -6; j <= 38; j++)
{
if(j % 2 == 1)
{
odds[i++] = j;
}
}
如果您不知道集合的长度,请更好地使用列表。
答案 4 :(得分:0)
当你只需要一个for循环时,你有两个for循环。 展开循环,您的程序正在执行以下操作:
numbers[0] = -6;
numbers[0] = -4;
numbers[0] = -2;
etc...
numbers[0] = 37;
numbers[1] = -6;
numbers[1] = -4;
etc...
答案 5 :(得分:0)
请尝试下面的
public static ArrayList<Integer> getOddList(int min,int max){
ArrayList<Integer> myList = new ArrayList<>();
for( int i = min ; i <= max ; i++){
if(i % 2 != 0){
myList.add(i);
}
}
return myList;
}
[-5, -3, -1, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37]
我在这里假设min和max u r提供的是有序的。我还没有测试我的功能。但这是你可以采取的实用程序。请让我知道
答案 6 :(得分:0)
您可以在不事先知道奇数的情况下执行此操作。
int[] oddNumbers = IntStream.range(-6, 38)
.filter(i -> i % 2 != 0)
.toArray();
答案 7 :(得分:0)
谢谢你们的回答。我把方法改为:
public static void oddsArray(){
int numberOfOdds = 0;
for (int i = -6; i <= 38; i++){
if (i % 2 == 1){
numberOfOdds++;
}
}
int[] odds = new int[numberOfOdds];
int i = 0;
for (int j = -6; j < 39; j++){
if (j % 2 == 1){
odds[i++] = j;
}
}
}
现在它只打印正奇数。
答案 8 :(得分:0)
我不确定是否有必要,但每次遇到一个新的奇数时,你可以重新创建一个包含奇数的数组。无论您使用何种范围,以下方法都可以使用。我知道你可以使用一个ArrayList,但问题似乎是想要一个数组。
public class exerciseOddsArray {
public static void main(String[] args) {
private int[] odds;
private int start = -6;
private int end = 38;
odds = findOdds(start, end);
if (odds== null)
System.out.println("There weren't any odds");
else
System.out.println(Arrays.toString(odds));
}
public static int[] findOdds(int start, int end) {
private int[] arrayOfOdds;
private int[] tempArray;
private int numberOfOdds = 0;
if (start < end)
{
while (start != end)
{
if ((start % 2) == 1)
{
if (arrayOfOdds != null)
{
tempArray = new int[arrayOfOdds.length + 1];
for (int i = 0; i < arrayOfOdds.length; i++)
tempArray[i] = arrayOfOdds[i];
tempArray[arrayOfOdds.length] = start;
arrayOfOdds = tempArray;
} else {
arrayOfOdds = new int[1];
arrayOfOdds[0] = start;
}
}
start++;
}
}
return arrayOfOdds;
}
}
答案 9 :(得分:0)
我有答案,这有效
int[] odds = new int[22];
for(int i = 0;i<odds.length;i++){
odds[i]=2*i-5;
}