“数组大小”的用户输入值实际上不会更改数组的大小。 【JAVA]

时间:2016-01-12 17:46:49

标签: java arrays

正如标题所说,我正在尝试将用户输入的大小输入到我的阵列中,但每次运行程序时都不会改变阵列大小。我很确定它与我的构造函数有关但我并不积极。任何帮助将不胜感激!

第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;          
        }
    }
}
}

3 个答案:

答案 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)函数,它设置数组大小并调整数组大小。例如,如果新的大小更大,则将所有元素(值)复制到新数组中,如果新的大小小于当前然后复制可以适合新数组的元素的最大数量,则当前具有一些额外空格是山姆大小没有必要改变任何东西。