繁体   English   中英

将数据插入未知长度数组java

[英]Inserting data into unknown length array java

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

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

当我运行它时,我输入了该项目的成本并出现错误。

如果我是你,我会使用数组列表。 它是您可以使用的动态数据结构,而不是您必须定义元素数量的典型数组。 您可以执行以下操作:

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

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

这样做可以防止您在声明数组时确切知道需要多少个元素。

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

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

有两个答案:

  1. 正如 BlackHatSamurei 建议的那样,您使用List<Double> numbers = new ArrayList<>() - 在添加其他元素时动态增长的现有类 [ 您一直使用List ,并且仅在实例化您使用特定 ArrayList 实现的具体对象时]
  2. 如果这是关于学习:您实现自己的 List 版本。 含义:您创建了一个使用数组存储数据的类,并且每当您想添加数组可以容纳的更多元素时; 您创建一个新的更大的数组并将所有数据复制到该数组中。

ArrayList

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

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

如果这是家庭作业,您的教师可能希望您了解这项杂务的详细信息,在这种情况下,我给您的答案是:创建新数组、复制项目、添加新项目、替换原始数组。

要使用Collection (请参阅 教程),您需要超越仅使用基元并使用实际对象。 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用于价格或与金钱相关的任何事情。 这两种数据类型都使用浮点技术,以牺牲准确性换取执行速度。 所以结果是近似的,而不是精确的,并且在小数部分的最右边经常有多余的数字。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM