本文介紹了如何在Java中找到列表中篩選出的元素的平均值的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我想知道某一特定分支機構在某一年的平均銷售額。有一張清單,上面有所有的分店和銷售年限。我嘗試使用IntStream來篩選具有所需年份和分支的元素,但我找不到平均值,indexOfSaleInTheYear.size()中顯示錯誤,并且我不確定平均部件代碼是否正確。請幫幫忙。謝謝。
Scanner avgSale = new Scanner(System.in);
System.out.println("Please enter the year for average sale:
");
int yearEntered = avgSale.nextInt();
Scanner branchNameForAvg = new Scanner(System.in);
System.out.println("Please enter the branch name whose average sale is to be found, case sensitive:
");
String branchNameEntered = branchNameForAvg.nextLine();
Stream<Integer> indexOfSalesInTheYear = IntStream.of(0, Sale.allValues.size()).boxed()
.filter(i -> Sale.allYears.get(i).equals(yearEntered))
.filter(i -> Sale.allBranches.get(i).equals(branchNameEntered));
int sum = 0;
for(int j = 0; j < indexOfSalesInTheYear.size(); j++){
sum += j;
}
double avgSaleFinal = sum/indexOfSalesInTheYear.size();
System.out.println("The average sale for the year " + yearEntered + " is " + avgSaleFinal + ".");
}
推薦答案
以下是我處理它的方式。不是單獨的值列表、年份列表和分支列表,而是包含以下字段的對象列表:
record Sale(int value, int year, String branch) {
}
這里我使用的是record
,但如果您愿意,需要具有可變的Sale
實例,或者正在使用Java的早期版本,您可以調整此代碼以使用具有普通getter和setter的類。
List<Sale> sales = List.of(
new Sale(12, 2020, "east"),
new Sale(15, 2020, "west"),
new Sale(13, 2020, "east"),
new Sale(16, 2020, "west"),
new Sale(14, 2020, "east"),
new Sale(17, 2020, "west"),
new Sale(18, 2021, "east"),
new Sale(19, 2021, "west"));
double averageOfSales(int year, String branchName) {
OptionalDouble average = sales.stream()
.filter(sale -> sale.year() == year)
.filter(sale -> sale.branch().equals(branchName))
.mapToInt(sale -> sale.value())
.average();
return average.orElseThrow(() ->
new NoSuchElementException("no matching year and branch"));
}
您可能只想返回OptionalDouble
或拋出一個不同的異常;這完全取決于您希望如何處理沒有提供年份和分支機構名稱的情況。在這種情況下,您甚至可能只想使用return 0.0
或NaN或-1.0或其他一些標記值。
由于IntStream
已有求和或求平均值的方法,因此無需自己對這些值求和或除以值的個數即可得出平均值。
將不同的數據分成獨立的并行結構是新Java程序員的常見模式,但這實際上與面向對象編程甚至抽象數據類型的概念背道而馳。您不需要保持簡單值的單獨集合;您可以發明自己的類型,包括值、年、分行、月、門牌號、郵政編碼,以及要作為正在處理的數據域的一部分建模的任何其他類型。
這篇關于如何在Java中找到列表中篩選出的元素的平均值的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,