如何在方法中为多个数组创建foreach循环?

时间:2016-10-08 17:40:49

标签: java arrays foreach sum

我是代码的初学者,所以如果我的数据结构和逻辑很糟糕,我会道歉。我需要打印每种产品的总销售额。例如,对于“mac”,它将被标记为Category 0,而“iphone”将被标记为Category 1.

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

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

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

3 个答案:

答案 0 :(得分: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中并且本着Object Orientation的精神,Product将是它自己的类,它将@Override toString()(所有类隐式扩展java.lang.Object)或将拥有自己的类方法名为printTotalSales()...

productList.foreach( Product::printTotalSales );

答案 1 :(得分:0)

我会使用BigDecimal类而不是整数来代价。

也许值得创建额外的两个字段 - categoryName和priceList。然后你将传递不是数组,但是这个类的实例传递给你的方法

此外,您可以考虑使用varargs。这允许您根据需要使用尽可能多的输入参数(相同类型)。这是一个例子 Java: Sending Multiple Parameters to Method

答案 2 :(得分:0)

&#39; totalSale&#39;的第二个版本(前一个版本)

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

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

输出结果为:

  

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

考虑使用Map。这是一个使用&#39; Map&#39;:

的实现
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;
    }
}