分割統治 :) はい、それがアルゴリズム技術に使用される用語であることは知っています。
最初に、単純な配列の最小、最大、平均を取得します。
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 ライブラリを使用できないため、最小/最大関数の独自のバージョンを簡単に実行できます ( 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 とその引き出しを関連付けるにはまだ問題があります。ここにはいくつかのオプションがあります。
- 「テーブル」ユーザー - >引き出しを作成します。これが、2つの配列でやろうとしていることです。配列内のユーザー インデックスは、「ユーザー 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);
}
}
追加メモ:コンピューター サイエンスを勉強している場合は、最大、最小、平均を計算するループが O(n) の複雑さを持っていることを将来学習します。値配列がメモリに完全にロードされている場合、3 つの異なる関数で最大/最小/平均を実行する (つまり、配列を 3 回読み取る) ことは、より大きな定数を使用した O(n) オーダーのアルゴリズムです。今日のコンピューターの能力では、定数は非常に小さいため、ほとんどの場合、同じループで最小/最大/平均を計算しても何の利益も得られません。対照的に、コードを読みやすくすることができます。たとえば、Groovy では、minMaxAvg コードは次のように記述できます。
def values = [2,3,4,5,6,7];
println values.min()
println values.max()
println values.sum() / values.size()