分而治之:) 是的,我知道这是一种用于算法技术的术语,在这种情况下,我的意思是......小部分工作。
首先具有一个简单的数组的最小值,最大值,平均值:
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