将数据插入到未知长度的数组java中

时间:2016-11-11 18:55:06

标签: java drjava

我正在为收据制作者制作一个程序,由于多个项目,数组长度未知。这是我的代码:

public static void main (String str[]) throws IOException {
    Scanner scan = new Scanner (System.in);
    //Entering Input
    int mult = 1;
    double price = 0;
    double y = 0;
    int l = 1;
    double [] list = new double[l];
    while(mult != 0){
      if (mult != 0)
        System.out.println("Please Enter the Cost of the Item: ");
        y = scan.nextDouble();
        list[l]= y;
        l++;
      System.out.println("More than one item? (1 = yes 0 = no) ");
      mult = scan.nextInt();
      if (mult != 0)
        price += y;
    }

当我运行它时,我输入项目的成本并得到错误。

3 个答案:

答案 0 :(得分:2)

如果我是你,我会使用数组列表。它是一个可以使用的动态数据结构,而不是必须定义元素数量的典型数组。你可以这样做:

ArrayList<Double list = new ArrayList<Double>();
list.add(y); 

然后你可以通过list.get(1)或你想要的任何元素来获取元素。

执行此类操作会阻止您在声明阵列时确切知道需要多少元素。

答案 1 :(得分:0)

没有 unknown 长度数组这样的东西。 Java中的任何数组(任何类型)都有一个字段 length

但实际上这不是你的问题;因为您没有使用传递给您的方法的数组。实质上,您正在询问如何将数组用于未知大小的输入。

有两个答案:

  1. 正如BlackHatSamurei建议的那样,你使用var string = "(ABCD)"; var normalize = { regexp: '/(\()(\w*)(\))/g', newValue: '$2' }; var newString = string.replace(new RegExp(normalize.regexp), normalize.newValue); console.log(newString); -> It's printing "(ABCD)" instead of "ABCD" - 现有的动态增长的类,在添加其他元素时[你一直使用List,并且仅在实例化具体时对象使用特定的ArrayList实现]
  2. 如果这是关于学习的:您实现了自己的版本的List。含义:您创建一个使用数组来存储数据的类,以及每当您想要添加数组可以容纳的更多元素时;您创建一个新的,更大的数组并将所有数据复制到该数组中。

答案 2 :(得分:0)

ArrayList

正如其他人所建议的那样,您应该使用Collection,特别是List,更具体地说是ArrayList

普通数组具有固定长度。它不会增长或缩小。要添加超出其容量的项目,您需要创建一个 new 更大的数组,并复制现有项目和新项目,最后删除原始数组。 ArrayList由数组支持但可以增长。实际上,后备阵列实际增长,它处理我刚刚代表你提到的细节:监视阵列以检测何时满,然后创建一个新阵列,复制项目。

如果这是家庭作业,你的导师可能会期待你学习这个家务的细节,在这种情况下我给你的答案是:创建一个新阵列,复制项目,添加新项目,替换原始阵列。

要使用Collection(请参阅Tutorial),您需要继续使用primitives并使用实际对象。 Java有一些原语来帮助程序员从C编程转换,但类和对象确实是Java的意义所在。相当于double原语的类是Double

List<Double> costs = new ArrayList<>();
// … get your inputs from user and add each price-item to list …
costs.add ( y );

简化您的逻辑

此外,您的逻辑很复杂,例如定义l但从不使用它。我尝试重写你的代码但放弃了。我建议你尝试更小的一口,一次做一件事,建立你想要的应用程序。获取单个价格项目的数据输入,然后在该工作后尝试支持多个价格项目。这就是真正的编程工作的方式,一次只做一小部分。

提示:在变量上使用描述性名称。这将有助于澄清你的想法。

BigDecimal

此外,在现实世界中,您永远不会将doubleDouble用于价格或任何与金钱相关的内容。这两种数据类型都使用floating-point technology,这会降低执行速度的准确性。因此结果是近似的,而不是精确的,并且通常在小数部分的最右侧具有无关数字。

对于金钱和准确性很重要的其他领域,请使用BigDecimal个对象。将BigDecimal作为字符串,而不是双值,因为您可能已经引入了可怕的无关数字。这个区域是学习使用对象而不是基元的另一个原因。

List<BigDecimal> costs = new ArrayList<>();
…
BigDecimal bd = new BigDecimal( userInputString ) ; // Input might be: 1.23
costs.add( bd );