2016-10-08 86 views
0

我是一名初学者,所以我很抱歉,如果我的数据结构和逻辑是不好的做法。我需要打印出每个产品的总销售额。例如,对于“MAC”将它标记为类别0,而“iphone”将被标记为1类。如何为一个方法中的多个数组创建一个foreach循环?

我无法匹配的类别与每个相应的类别的总和的索引位置。我真的只需要一些for循环。我意识到我可以制作二维数组以及使用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; 
} 
+0

你似乎是假设所有的数组'INT [] MAC,INT [] iphone,INT [] iPad上,INT [] ipod'具有相同的长度。是这样吗?他们代表什么? – Alain

+0

@ lain对不起。我添加了示例输入值。但是阵列应该代表列出的日期的成本列表 – SSW

+0

当您运行第一个版本时会得到什么错误? – Alain

回答

0

第2版(较早的企业之一)的“totalSale”

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

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

的输出是:

总销售为0类别:$ 34500
总销售1类别:$ 9500
总销售2类:$四百三万一千七
总销售3类:$ 25920

考虑使用Map。下面是使用 '地图' 的implmentation:

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

它的工作原理!但问题是如果有超过4个输入值 - 它不能正确打印。所以这是无用的,因为这些方法应该能够输入多达31个值。 – SSW

+0

如果它适用于4,它将为31工作。您需要将31个数组传递给'totalSale'并使int [] totalSale大小为31.非常麻烦当然,因此我建议使用map。 – c0der

+0

我添加了一个使用'Map'的实现,它更具有可扩展性。 – c0der

0

我会用BigDecimal类,而不是整数的stroing价格。

另外也许值得创建额外的类蒙道两个字段 - categoryName和priceList。然后,你会通过不列,但这个类的实例,以你的方法

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

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和面向对象的精神,产品将是它自己的类,它会@Override的toString()(所有的类都隐式扩展java.lang.Object)或将有它自己的方法称为printTotalSales()...

productList.foreach(Product::printTotalSales); 
相关问题