将数据插入未知长度数组 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.
但实际上这不是你的问题;因为您根本没有使用传递给您的方法的数组。本质上,您是在询问如何将数组用于未知大小的输入。
有两个答案:
- 正如 BlackHatSamurei 所建议的那样,您使用
List<Double> numbers = new ArrayList<>()
- 现有 class 在添加其他元素时 动态增长 [在您使用 List 的地方始终,并且仅在实例化具体对象时使用特定的 ArrayList 实现]
- 如果这是关于学习的:您实现自己的 版本的 List。意思是:你创建了一个 class ,它使用数组来存储数据,并且每当你想添加数组可以容纳的更多元素时;您创建一个更大的新数组并将所有数据复制到该数组中。
ArrayList
正如其他人所建议的,您应该使用 Collection
, specifically a List
, more specifically an ArrayList
。
普通数组是固定长度的。它不会变大或变小。要添加超出其容量的项目,您可以创建一个更大的 new 数组并复制现有项目和新项目,最后删除原始数组。 ArrayList
由数组支持但可以增长。实际上,后备数组 实际上 不会增长,它会处理我刚才代表您提到的细节:监视数组以检测何时已满,然后创建一个新数组,将项目复制过来。
如果这是家庭作业,您的老师可能希望您了解这件苦差事的细节,在这种情况下,我给您的答案是:创建新数组、复制项目、添加新项目、替换原始数组。
要使用 Collection
(参见 Tutorial), you need to progress past working with just primitives and use actual objects. Java has primitives to help programmers transitioning from C programming, but classes and objects is really what Java is about. The class equivalent to double
primitive is Double
。
List<Double> costs = new ArrayList<>();
// … get your inputs from user and add each price-item to list …
costs.add ( y );
简化你的逻辑
另外,你的逻辑很复杂,比如定义了l
却从来没有使用过。我尝试重写您的代码但放弃了。我建议您尝试更小的部分,一次只做一件事,构建您想要的应用程序。让数据输入为单个价格项目工作,然后在工作之后尝试支持多个价格项目。真正的编程工作就是这样完成的,一次一小块。
提示:在变量上使用描述性名称。这将有助于理清思路。
BigDecimal
此外,在现实世界中,您永远不会使用 double
或 Double
来表示价格或与金钱相关的任何内容。这两种数据类型都使用 floating-point technology 来牺牲执行速度的准确性。所以结果是近似的,而不是精确的,并且经常在小数点的最右边有多余的数字。
对于金钱和其他准确性很重要的领域,请使用 BigDecimal
对象。输入 BigDecimal
一个字符串,而不是双精度值,因为您可能已经引入了可怕的无关数字。这个区域是学习使用对象而不是基元的另一个原因。
List<BigDecimal> costs = new ArrayList<>();
…
BigDecimal bd = new BigDecimal( userInputString ) ; // Input might be: 1.23
costs.add( bd );
我正在为收据制造商制作一个程序,由于有多个项目,数组长度未知。这是我的代码:
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.
但实际上这不是你的问题;因为您根本没有使用传递给您的方法的数组。本质上,您是在询问如何将数组用于未知大小的输入。
有两个答案:
- 正如 BlackHatSamurei 所建议的那样,您使用
List<Double> numbers = new ArrayList<>()
- 现有 class 在添加其他元素时 动态增长 [在您使用 List 的地方始终,并且仅在实例化具体对象时使用特定的 ArrayList 实现] - 如果这是关于学习的:您实现自己的 版本的 List。意思是:你创建了一个 class ,它使用数组来存储数据,并且每当你想添加数组可以容纳的更多元素时;您创建一个更大的新数组并将所有数据复制到该数组中。
ArrayList
正如其他人所建议的,您应该使用 Collection
, specifically a List
, more specifically an ArrayList
。
普通数组是固定长度的。它不会变大或变小。要添加超出其容量的项目,您可以创建一个更大的 new 数组并复制现有项目和新项目,最后删除原始数组。 ArrayList
由数组支持但可以增长。实际上,后备数组 实际上 不会增长,它会处理我刚才代表您提到的细节:监视数组以检测何时已满,然后创建一个新数组,将项目复制过来。
如果这是家庭作业,您的老师可能希望您了解这件苦差事的细节,在这种情况下,我给您的答案是:创建新数组、复制项目、添加新项目、替换原始数组。
要使用 Collection
(参见 Tutorial), you need to progress past working with just primitives and use actual objects. Java has primitives to help programmers transitioning from C programming, but classes and objects is really what Java is about. The class equivalent to double
primitive is Double
。
List<Double> costs = new ArrayList<>();
// … get your inputs from user and add each price-item to list …
costs.add ( y );
简化你的逻辑
另外,你的逻辑很复杂,比如定义了l
却从来没有使用过。我尝试重写您的代码但放弃了。我建议您尝试更小的部分,一次只做一件事,构建您想要的应用程序。让数据输入为单个价格项目工作,然后在工作之后尝试支持多个价格项目。真正的编程工作就是这样完成的,一次一小块。
提示:在变量上使用描述性名称。这将有助于理清思路。
BigDecimal
此外,在现实世界中,您永远不会使用 double
或 Double
来表示价格或与金钱相关的任何内容。这两种数据类型都使用 floating-point technology 来牺牲执行速度的准确性。所以结果是近似的,而不是精确的,并且经常在小数点的最右边有多余的数字。
对于金钱和其他准确性很重要的领域,请使用 BigDecimal
对象。输入 BigDecimal
一个字符串,而不是双精度值,因为您可能已经引入了可怕的无关数字。这个区域是学习使用对象而不是基元的另一个原因。
List<BigDecimal> costs = new ArrayList<>();
…
BigDecimal bd = new BigDecimal( userInputString ) ; // Input might be: 1.23
costs.add( bd );