【问题标题】:How do I create a foreach loop for multiple arrays in a method?如何在一个方法中为多个数组创建一个 foreach 循环?
【发布时间】:2016-10-08 17:40:48
【问题描述】:

我是代码初学者,如果我的数据结构和逻辑实践不佳,我深表歉意。我需要打印出每种产品的总销售额。例如,对于“mac”,它将被标记为类别 0,而“iphone”将被标记为类别 1。

我无法将类别的索引位置与每个类别的总和进行匹配。我真的只需要某种 for 循环。我意识到我可以制作 2D 数组以及使用 intstream,但我还没有学会它。这只是代码的一部分,所以使用二维数组确实会使事情复杂化。

现在,我正在尝试以下方法:

public static int[] totalSale( int[] mac, int[] iphone, int[] ipad, int[] ipod ){
    int[] totalSale = {0,0,0,0};
    int sum = 0;
    for (int i : mac) {
        sum += i;
    }
    for (int i = 0; i < totalSale.length; i++) {
        System.out.println("Total sale for category " + i + ": $" + sum);
    }
    return totalSale;
}

【问题讨论】:

  • 您似乎假设所有数组int[] mac, int[] iphone, int[] ipad, int[] ipod 具有相同的长度。是这样吗?它们代表什么?
  • @Alain 对此感到抱歉。我添加了示例输入值。但是数组应该代表列出的日期的成本列表
  • 当您运行第一个版本时遇到什么错误?
  • 它打印: 类别 0 的总销售额:$34500 类别 1 的总销售额:$34500 类别 2 的总销售额:$34500 类别 3 的总销售额:$34500 所以我猜它只打印我输入的内容mac,但我不确定如何使其也适用于其他数组。
  • 首先我的意思是最早的。你列出的第二个。我觉得很好。

标签: java arrays foreach sum


【解决方案1】:

您可以尝试创建一个更通用/可重用的方法。让您的方法一次只计算一种产品的总销售额。

public static int totalSale( int[] salesFigures )
{
    int totalSale = 0;
    // calculate total sale of one product only. HINT: salesFigures.length
    return totalSale;
}

您可以将所有产品数组存储在 ArrayList 中,然后在循环中调用 totalSale()。

for(/*number of products*/)
{
    //totalSales(productArray);
}

查看java.util.Collections 的文档 – 当它读到这样的东西时,foreach 循环将开始变得更加有用......

for( Product prod : productList ) // for each product in productList
{
    System.out.println( totalSales(prod) );
}

...在 Java 8 中,本着面向对象的精神,Product 将是它自己的类,它将 @OverridetoString()(所有类都隐式扩展 java.lang.Object)或者拥有自己的称为 printTotalSales( )...

productList.foreach( Product::printTotalSales );

【讨论】:

    【解决方案2】:

    “totalSale”的第二版(较早的版本)

    public static int[] totalSale( int[] mac, int[] iphone, int[] ipad, int[] ipod ){
    

    不是最优的,但它是正确的。它将打印出正确的值。
    试试here

    输出是:

    类别 0 的总销售额:34500 美元
    类别 1 的总销售额:9500 美元
    第 2 类的总销售额:4301700 美元
    第 3 类的总销售额:25920 美元

    考虑使用Map。这是使用“地图”的实现:

    import java.util.HashMap;
    import java.util.Map;
    
    public class Test{
    
        public static void main(String[] arguments) {
    
            //map category to sales values
            Map<String, int[]> salesMap = new HashMap<>();
    
            //map category to sales totals
            Map<String, Integer> totalSalesMap = new HashMap<>();
    
            int[] mac = {11500,9000,13000,900,100};//total 34500
            salesMap.put("Mac",mac);
            int[] iphone = {1100,5000,3400,0,0};//total $9500
            salesMap.put("Iphone",iphone);
            int[] ipad = {900,4300000,0,800,0};
            salesMap.put("Ipad",ipad);
            int[] ipod = {0,300,120,500,25000};
            salesMap.put("Ipod",ipod);
    
            totalSalesMap = totalSale(salesMap);
    
            //print totals:
            for( String category : totalSalesMap.keySet()){
                System.out.println("Total sale for category "
                                + category + ": $" + totalSalesMap.get(category));
            }
        }
    
        public static Map<String, Integer> totalSale(Map<String, int[]> salesMap){
    
            //returned map holding sales totals
            Map<String, Integer> totalSalesMap = new HashMap<>();
    
            //iterate over sales map and sum values into totalSalesMap
            for( String category : salesMap.keySet()){
    
                int[] sales = salesMap.get(category);
                int salesSum = sumArray(sales);
    
                //add total to returned map
                totalSalesMap.put(category, salesSum);
            }
    
            return totalSalesMap;
        }
    
        private static int sumArray(int[] array) {
    
            int sum = 0;
            for(int i : array) {
                sum += i;
            }
    
            return sum;
        }
    }
    

    【讨论】:

    • 有效!但问题是如果有超过 4 个输入值 - 它不能正确打印出来。所以它没有用,因为这些方法应该能够接受最多 31 个值的输入。
    • 如果它适用于 4,它将适用于 31。您需要将 31 个数组传递给`totalSale`,并使 int[] totalSale 大小为 31。当然非常麻烦,因此我建议使用 map .
    • 我添加了一个使用Map 的实现,它更具可扩展性。
    【解决方案3】:

    我会使用 BigDecimal 类而不是整数来计算价格。

    也许还值得创建包含两个字段的附加类 - categoryName 和 priceList。然后你将不是数组,而是这个类的实例传递给你的方法

    此外,您可以研究使用可变参数。这允许您使用任意数量的输入参数(相同类型)。这是一个例子 Java: Sending Multiple Parameters to Method

    【讨论】:

      猜你喜欢
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2020-02-09
      • 2011-10-22
      • 2012-04-26
      相关资源
      最近更新 更多