分而治之 :) 是的,我知道这是一个用于算法技术的术语,在这种情况下,我的意思是......使用小部件。
首先有一个简单数组的最小值,最大值,平均值:
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 库来完成你的作业,所以很容易做你自己版本的 min/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]);
}
使用数组有点难读,所以如果你创建一个类来保存最小值、最大值、平均值会更好。所以让我们稍微重构一下代码:
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);
}
您没有在问题中指定它,但我假设您为每个用户都有一个数组(也许每次取款都是另一个数组)。现在你有了底部部分,我们可以切换到自上而下的思维。
所以你的代码可能是这样的:
for (User aUser : users) {
System.out.println("User: " + aUser);
System.out.println(ValueSummary.createFor(withdrawalsOf(aUser)));
}
好的,但这只是想法,您仍然无法将 aUser 与其提款联系起来。您在这里有几个选择:
- 制作一个“表格”用户-> 取款,这就是您要对这两个数组执行的操作。数组中的用户索引就像一个“用户 ID”。当您了解 Map 时,您会发现可以为索引使用更好的表示。
- 拥有 Map 或数组只是关系 User->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);
}
}
附加说明:如果您正在学习计算机科学,将来您将了解到计算 max、min、avg 的循环的复杂度为 O(n)。如果值数组完全加载到内存中,则在三个不同的函数中执行 max/min/avg(因此读取数组 3 次)仍然是具有更大常数的 O(n) 阶算法。凭借当今计算机的强大功能,该常数非常小,以至于大多数时候您不会从在同一循环中计算 min/max/avg 获得任何收益。相反,您可以获得代码可读性,例如在 Groovy 中,minMaxAvg 代码可以这样编写:
def values = [2,3,4,5,6,7];
println values.min()
println values.max()
println values.sum() / values.size()