本文介紹了如何在Java中找到列表中篩選出的元素的平均值的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我想知道某一特定分支機(jī)構(gòu)在某一年的平均銷售額。有一張清單,上面有所有的分店和銷售年限。我嘗試使用IntStream來篩選具有所需年份和分支的元素,但我找不到平均值,indexOfSaleInTheYear.size()中顯示錯(cuò)誤,并且我不確定平均部件代碼是否正確。請(qǐng)幫幫忙。謝謝。
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 + ".");
}
推薦答案
以下是我處理它的方式。不是單獨(dú)的值列表、年份列表和分支列表,而是包含以下字段的對(duì)象列表:
record Sale(int value, int year, String branch) {
}
這里我使用的是record
,但如果您愿意,需要具有可變的Sale
實(shí)例,或者正在使用Java的早期版本,您可以調(diào)整此代碼以使用具有普通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
或拋出一個(gè)不同的異常;這完全取決于您希望如何處理沒有提供年份和分支機(jī)構(gòu)名稱的情況。在這種情況下,您甚至可能只想使用return 0.0
或NaN或-1.0或其他一些標(biāo)記值。
由于IntStream
已有求和或求平均值的方法,因此無需自己對(duì)這些值求和或除以值的個(gè)數(shù)即可得出平均值。
將不同的數(shù)據(jù)分成獨(dú)立的并行結(jié)構(gòu)是新Java程序員的常見模式,但這實(shí)際上與面向?qū)ο缶幊躺踔脸橄髷?shù)據(jù)類型的概念背道而馳。您不需要保持簡單值的單獨(dú)集合;您可以發(fā)明自己的類型,包括值、年、分行、月、門牌號(hào)、郵政編碼,以及要作為正在處理的數(shù)據(jù)域的一部分建模的任何其他類型。
這篇關(guān)于如何在Java中找到列表中篩選出的元素的平均值的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,