分而治之:) 是的,我知道這是一種用於算法技術的術語,在這種情況下,我的意思是......小部分工作。
首先具有一個簡單的數組的最小值,最大值,平均值:
double[] values = {2,3,4,5,6,7};
double min = values[0];
double max = values[0];
double sum = 0;
for (double value : values) {
min = Math.min(value, min);
max = Math.max(value, max);
sum += value;
}
double avg = sum/values.length;
System.out.println("Min: " + min);
System.out.println("Max: " + max);
System.out.println("Avg: " + avg);
注:既然你不能使用你的任務Java庫,是很容易做你自己最小的版本/ MAX功能(讀Math JavaDoc)
現在你可以封裝在一個函數的代碼,你可以通過返回另一個數組開始:
static double[] minMaxAvg(double[] values) {
double min = values[0];
double max = values[0];
double sum = 0;
for (double value : values) {
min = Math.min(value, min);
max = Math.max(value, max);
sum += value;
}
double avg = sum/values.length;
return new double[] {min, max, avg};
}
public static void main(String[] args) {
double[] values = {2,3,4,5,6,7};
double[] info = minMaxAvg(values);
System.out.println("Min: " + info[0]);
System.out.println("Max: " + info[1]);
System.out.println("Avg: " + info[2]);
}
使用數組有點難看,所以如果您創建一個類來保存min,max,avg會更好。所以,讓我們重構代碼,一點點:
class ValueSummary {
final double min;
final double max;
final double avg;
static ValueSummary createFor(double[] values) {
double min = values[0];
double max = values[0];
double sum = 0;
for (double value : values) {
min = Math.min(value, min);
max = Math.max(value, max);
sum += value;
}
double avg = sum/values.length;
return new ValueSummary(min, max, avg);
}
ValueSummary(double min, double max, double avg) {
this.min = min;
this.max = max;
this.avg = avg;
}
public String toString() {
return "Min: " + min + "\nMax: " + max +"\nAvg: " + avg;
}
}
public static void main(String[] args) {
double[] values = {2,3,4,5,6,7};
ValueSummary info = ValueSummary.createFor(values);
System.out.println(info);
}
你不要在你的問題中指定,但我認爲你必須爲每個用戶(也許每個取款是另一個數組)的數組。 現在您已經有底部零件了,我們可以切換到top-down thinking。
所以,你的代碼可能是這樣的:
for (User aUser : users) {
System.out.println("User: " + aUser);
System.out.println(ValueSummary.createFor(withdrawalsOf(aUser)));
}
好,但是這僅僅是想法,你仍然有其提款涉及aUser問題。您有幾種選擇在這裏:
- 做一個「表」用戶 - >提款,那是你試圖用兩個數組做。數組中的User索引就像一個「用戶ID」。當您瞭解Map時,您會看到您可以使用更好的索引表示法。
- 有一個地圖或陣列僅僅是一個優化,關係用戶 - > Withdrawls的,但可以表示與對象(即UserWithdrawls)
選項1該關係:
static class User {
final String name;
public User(String s) { name = s; }
}
public static void main(String[] args) {
User[] users = { new User("John"), new User("Doe")};
double[][] withdrawals = {
new double[] { 1, 2, 3}, new double[] { 10,22, 30}
};
for (int i = 0; i < users.length; i++) {
System.out.println("User: " + users[i].name);
System.out.println(ValueSummary.createFor(withdrawals[i]));
}
}
選項2:
static class User {
final String name;
public User(String s) { name = s; }
}
static class UserWithdrawls {
final User user;
final double[] withdrawals;
final ValueSummary summary;
UserWithdrawls(User user, double[] withdrawals) {
this.user = user;
this.withdrawals = withdrawals;
this.summary = ValueSummary.createFor(withdrawals);
}
}
public static void main(String[] args) {
UserWithdrawls[] userWithdrawls = {
new UserWithdrawls(new User("John"), new double[] { 1, 2, 3}),
new UserWithdrawls(new User("Doe"), new double[] { 10, 22, 30})
};
for (UserWithdrawls uw : userWithdrawls) {
System.out.println("User: " + uw.user.name);
System.out.println(uw.summary);
}
}
個其他注意事項:如果你正在學習計算機科學,您將瞭解,在未來的循環來計算最大值,最小值,平均值度爲O(n)的複雜性。如果這些值陣列在存儲器滿載,做在三個不同功能的MAX/MIN/AVG(這樣就可以讀取陣列3次)仍是一個更大的恆定爲O(n)順序的算法。利用當今計算機的強大功能,常數非常小,大多數時候,在同一個循環中計算最小/最大/平均值時,您將無法獲得任何收益。相反,你可以得到代碼的可讀性,例如在Groovy中minMaxAvg代碼可以這樣寫:
def values = [2,3,4,5,6,7];
println values.min()
println values.max()
println values.sum()/values.size()
我只能說,謝謝你噓很多時間和精力用於解釋這一點,它幫助我瞭解一切,並希望幫助別人.. 。,聖地亞哥! :) – Hotmama 2012-08-12 05:10:35