正如标题所说,我正在尝试将用户输入的大小输入到我的阵列中,但每次运行程序时都不会改变阵列大小。我很确定它与我的构造函数有关但我并不积极。任何帮助将不胜感激!
第1类(数字)
package lab1;
import java.util.Random;
public class Numbers {
public int size;
public Integer[]arr = new Integer [size];
public Numbers () {
for (int i = 0; i < size; i++){
arr[i] = new Integer(i);
}
}
public Numbers(int size){
this.size = size;
for (int i = 0; i < size; i++){
arr[i] = new Integer(i);
}
}
public void generateNumbers(){
System.out.println(arr.length);
Random rand = new Random();
for (int i = 0; i < arr.length; i++)
{
arr[i] = rand.nextInt(100);
}
}
public int count(int val){
int count = 0;
for (int i = 0; i < arr.length; i++){
if (arr[i] == val){
count++;
}
}
return count;
}
public String toString() {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < arr.length; i++){
builder.append(arr[i]).append(" ");
}
return builder.toString();
}
}
2级(Lab1)
package lab1;
import java.util.Scanner;
public class Lab1 {
public static void main(String[] args)
{
Numbers numbers = new Numbers();
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
int menu = 1;
while (menu != 0){
System.out.println("1 to create array of new size\n"
+ "2 to generate random numbers into array\n"
+ "3 to count a value\n"
+ "4 to display array\n"
+ "0 to quit\n");
menu = input.nextInt();
switch (menu) {
case 1:
System.out.println("Enter new size:\n");
int size = input.nextInt();
size = numbers.size;
System.out.println("Array has been generated of size: " + numbers.size + "\n");
break;
case 2:
numbers.generateNumbers();
System.out.println("Numbers have been generated\n");
break;
case 3:
System.out.println("Enter number to search for:\n");
int num = input.nextInt();
System.out.println("There are " + numbers.count(num) + " of the number " + num);
break;
case 4:
System.out.println(numbers.toString());
break;
}
}
}
}
答案 0 :(得分:1)
第一个问题:您未在size
的实例中更改Numbers
的值:
size = numbers.size;
这会更新局部变量size
,而不是numbers
的成员变量,会覆盖您刚从扫描仪读取的值。要使用该值更新成员变量:
numbers.size = size;
第二个问题:你实际上并没有改变数组的大小。
在初始化类的实例时创建数组:
public int size;
public Integer[]arr = new Integer [size];
在创建时,size
为零,因此arr
被初始化为零长度数组。更改size
的值不会自动更改arr
的大小。
您需要创建一个新实例并将其分配给arr
成员变量。如果您在施工时指定此项:
public Numbers(int size){
this.size = size;
this.arr = new Integer[size];
for (int i = 0; i < size; i++){
arr[i] = new Integer(i);
}
}
请注意,因为size == 0
最初,您的默认构造函数(public Numbers()
)不执行任何操作:for循环for (int i = 0; i < size; i++){
的主体永远不会执行,因为i == 0
和{{ 1}}最初,所以size == 0
是假的。您应该只删除默认构造函数,因此始终必须指定0 < 0
的值来构造实例。
如果删除默认构造函数,则可以删除size
的内联初始化:
arr
因为将在构造函数中分配非null值。
或者,如果您只在代码中使用public Integer[]arr;
,则可以删除两个构造函数,并将字段声明为:
Numbers
但是,在代码中,您尝试在构造数组后更改数组的长度。在这种情况下,只要更改public int size = 0;
public Integer[] arr = new Integer[0];
的值,就需要创建一个新数组,例如:
size
numbers.size = size;
numbers.arr = Arrays.copyOf(numbers.arr, numbers.size);
将适当截断您的数组或用零填充它,具体取决于Arrays.copyOf
是否小于或大于数组的当前长度。
请注意,通常会将此类更改封装在size
:
Numbers
并创建字段public void setSize(int size) {
this.size = size;
this.arr = Arrays.copyOf(this.arr, size);
}
,以便只能通过private
中的方法更新它们:
Numbers
最后,请注意private int size;
private Integer[]arr;
是多余的:您可以将其删除,只需使用size
。
答案 1 :(得分:0)
尝试替换此代码块:
public Integer[]arr = new Integer [size];
因为没有必要,请删除下面的belock:
public Numbers () {
for (int i = 0; i < size; i++) {
arr[i] = new Integer(i);
}
}
下面的Mantaine:
public Numbers(int size) {
this.size = size;
for (int i = 0; i < size; i++) {
arr[i] = new Integer(i);
}
}
使用:
public Integer[] arr; // here declared
public Numbers(int size) {
this.size = size;
arr = new Integer[size]; //here initialize it
for (int i = 0; i < size; i++) {
arr[i] = new Integer(i);
}
}
像这样你用用户输入给出数组的大小。
答案 2 :(得分:0)
在构造函数中,您将创建int数组。 调用新的Numbers()时,创建的对象的数组大小为0。 然后,当您使用numbers.size设置大小时,您只需更改大小变量,而不更改数组的大小。 你是什么创建一个setSize(int newSize)函数,它设置数组大小并调整数组大小。例如,如果新的大小更大,则将所有元素(值)复制到新数组中,如果新的大小小于当前然后复制可以适合新数组的元素的最大数量,则当前具有一些额外空格是山姆大小没有必要改变任何东西。