字符串和Int数组未初始化为正确的值

时间:2013-11-17 09:17:01

标签: java arrays

所以我在这里尝试做的是将我的字符串初始化为空字符串并将我的整数初始化为0.显示报告目前是一种调试器,当我运行调用displayReport的程序时,它只是将我的整数和字符串显示为null。它必须是我的for循环中的东西,但我似乎无法弄清楚我做错了什么。

编辑:要清楚,我必须使用private void initializeString(String [] s)和private void initializeInt(int [] a)。我的构造函数有这些指南

public constructor:初始化保存软饮料名称和ID的数组以保存所有空字符串(调用intitializeString两次以执行任务)。将包含起始库存,最终库存和事务数计数的数组初始化为零(调用initializeInt三次以执行任务)。

import java.util.Scanner;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class SoftDrinkInventory {

    static final int MAXSIZE = 100;      // maximum size of 100
    private String[] names;             // softdrink names
    private String[] ids;               // softdrink identifications
    private int[] startingInventory;    // starting inventory of the softdrinks
    private int[] finalInventory;       // final inventory of the softdrinks
    private int[] transactionCounts;    // number of transactions per softdrink
    private int trueSize;               // total number of softdrinks

    /**-----------------------------------------------------------------------
     * constructor  
     * 
     * Initializes arrays holding soft drink name, ID number to the
     * empty string. Initializes starting inventory, final inventory,
     * and transaction counts are to zero.
     */
    public SoftDrinkInventory() {

        initializeString(names);
        initializeString(ids);
        initializeInt(startingInventory);
        initializeInt(finalInventory);
        initializeInt(transactionCounts);

    }

    /**-----------------------------------------------------------------------
     * displayReport  
     * 
     * Displays a report including soft drink name, ID, starting inventory,
     * final inventory, and number of transactions processed.
     */

    public void displayReport() {
       System.out.printf("%-22s %-16s %-23s %-23s %s %n", "Soft Drink", "ID",
                         "Starting Inventory", "Final Inventory",
                         "# transaction");
       for(int i = 0; i < 10; i++) {
           System.out.printf("%-22s %-16s %-23f %-23f %f %n", names, ids,
                             startingInventory, finalInventory, 
                             transactionCounts);

       }

    }

    /**-----------------------------------------------------------------------
     * initializeInt 
     * 
     * Takes an int array parameter and initializes its array values to zero.
     * @param a int array
     */
    private void initializeInt(int[] a) {

        a = new int[MAXSIZE];

        for(int i = 0; i < a.length; i++) {
            a[i] = 0;
        }

    }

    /**-----------------------------------------------------------------------
     * initializeString 
     * 
     * Takes a String array parameter and initializes its array values to 
     * the empty string.
     * @param s string array
     */
    private void initializeString(String[] s) {

        s = new String[MAXSIZE];


        for(int i = 0; i < s.length; i++) {
            s[i] = "";

        }


    }

}

5 个答案:

答案 0 :(得分:3)

Java使用pass by value。这意味着您传入的引用正在被修改,而不是原件。最简单的解决方案是返回所需的数组。

names = initialiseString(100);

然而,更好的方法是使用像

这样的对象列表
private final List<Item> items = new ArrayList<>();

// to add
items.add(new Item("name", "id", 1234, 10, 1224));

// you can add any size 0 up to 2 billion.
int actualSize = items.size();


class Item {
    private String name;             // softdrink name
    private String id;               // softdrink identification
    private int startingInventory;   // starting inventory of the softdrink
    private int finalInventory;      // final inventory of the softdrink
    private int transactionCount;
} 

答案 1 :(得分:2)

您不能在该方法中覆盖作为参数传递给方法的引用。当您执行a = new int[MAXSIZE];时,您正在创建一个仅对该方法可见的数组。您需要做的是返回创建的数组。你可能会考虑做这样的事情:

private int[] initializeInt(int size) {
    ...
}
...
startingInventory = initializeInt(MAXSIZE);

答案 2 :(得分:2)

因为您正在初始化那些初始化方法的本地数组。而不是将参数传递给方法,只需在方法中创建并初始化一个新数组,并将这些数组返回到各自的实例变量。 例如,将您的initializeString(String[])更改为public String[] initializeString(),并在此方法中写下:

String[] names = new String[MAXSIZE]; 
for(int i = 0; i < names.length; i++) { names[i] = "";} return names;

然后在构造函数中调用此方法,如下所示

names =  initializeString();

答案 3 :(得分:0)

有些Java函数将数组作为参数,将数据放入数组中,并且可供您使用。

例如:

 BufferedReader.read(char[] cbuf, int off, int len)

但是,您必须先创建数组,然后才填充它。因此,在调用该函数之前必须先执行此操作:

 char[] cbuf = new char[100];

由于你的方法是在同一个类中初始化数组,你可以只做Vishal K说,而不是将数组传递给方法。在其他地方调用方法的情况下,只要先创建对象,就可以将对象作为参数传递给其他类中的方法。被调用者可以使用传递的引用来修改对象。

答案 4 :(得分:-1)

当然有更好的方法可以做到这一点(例如使用Peter Lawrey建议的对象列表),但由于这是你所拥有的规范,你可以试试这个:当你声明你的数组时,为他们分配内存:

private String[] names = new String[MAXSIZE];             // softdrink names
private String[] ids = new String[MAXSIZE];               // softdrink identifications
private int[] startingInventory = new int[MAXSIZE];    // starting inventory of the softdrinks
private int[] finalInventory = new int[MAXSIZE];       // final inventory of the softdrinks
private int[] transactionCounts = new int[MAXSIZE];    // number of transactions per softdrink

然后,在您的函数中,您只需将值赋值为0并清空String:

private void initializeInt(int[] a) {
    for(int i = 0; i < a.length; i++) {
        a[i] = 0;
    }
}

private void initializeString(String[] s) {
    for(int i = 0; i < s.length; i++) {
        s[i] = "";
    }
}

请注意,您的 displayReport()功能也有错误。您正在使用%f来显示int值(%f用于浮点数)。而是将其更改为%d。此外,在for循环中,您实际上并没有循环遍历数组。迭代时只需使用i作为索引。另一件事是您只显示10个条目,而用于初始化数组的MAXSIZE是100,所以如果要显示所有数组元素,请将10更改为MAXSIZE:

public void displayReport() {
   System.out.printf("%-22s %-16s %-23s %-23s %s %n", "Soft Drink", "ID",
                     "Starting Inventory", "Final Inventory",
                     "# transaction");
   for(int i = 0; i < MAXSIZE; i++) {
       //change "%-22s %-16s %-23f %-23f %f %n" to the below
       //and names etc. to names[i] etc.
       System.out.printf("%-22s %-16s %-23d %-23d %d %n", names[i], ids[i],
                         startingInventory[i], finalInventory[i], 
                         transactionCounts[i]);

   }
}