編集:平均的なコードを記述しましたが、配列ではなくargs.lengthのintも使用するようにする方法がわかりません
計算できるJavaプログラムを作成する必要があります:1。読み取られた整数の数2.平均値-整数である必要はありません!
注意!配列から平均を計算したくはありませんが、引数の整数を計算します。
現在私はこれを書いています:
int count = 0;
for (int i = 0; i<args.length -1; ++i)
count++;
System.out.println(count);
}
int nums[] = new int[] { 23, 1, 5, 78, 22, 4};
double result = 0; //average will have decimal point
{
for(int i=0; i < nums.length; i++){
result += nums[i];
}
System.out.println(result/count)
}
誰かが私を正しい方向に導くことができますか?または、このコードを形作るための書き方をガイドする例を挙げてください。
前もって感謝します
コードを少し変更するだけで十分です(わかりやすくするために変数の名前を変更します)。
double sum = 0; //average will have decimal point
for(int i=0; i < args.length; i++){
//parse string to double, note that this might fail if you encounter a non-numeric string
//Note that we could also do Integer.valueOf( args[i] ) but this is more flexible
sum += Double.valueOf( args[i] );
}
double average = sum/args.length;
System.out.println(average );
ループも簡略化できることに注意してください。
for(String arg : args){
sum += Double.valueOf( arg );
}
編集:OPはargs
配列を使用したいと考えているようです。これは文字列配列のようであるため、それに応じて回答を更新しました。
更新:
Zoxqojが正しく指摘しているように、上記のコードでは整数/二重オーバーフローは処理されません。入力値はその問題が発生しないほど小さいと思いますが、実際に大きい入力値に使用するスニペットは次のとおりです。
BigDecimal sum = BigDecimal.ZERO;
for(String arg : args){
sum = sum.add( new BigDecimal( arg ) );
}
このアプローチにはいくつかの利点があります(多少遅くなりますが、タイムクリティカルな操作には使用しないでください)。
BigDecimal
はdouble
またはlong
に収まるものよりも大きい場合があることに注意してください。int values[] = { 23, 1, 5, 78, 22, 4};
int sum = 0;
for (int i = 0; i < values.length; i++)
sum += values[i];
double average = ((double) sum) / values.length;
この
for (int i = 0; i<args.length -1; ++i)
count++;
基本的にargs.length
を再度計算しますが、正しくありません(ループ条件はi<args.length
である必要があります)。代わりにargs.length
(またはnums.length
)を直接使用しないのはなぜですか?
それ以外の場合、コードは問題ないようです。コマンドラインから入力を読み取りたいように見えますが、それを数値の配列に変換する方法がわかりませんが、これは本当の問題ですか?
System.out.println(result/count)
result/countはString型ではなく、System.out.println()はStringパラメーターのみを受け取るため、これを行うことはできません。おそらく試してみてください:
double avg = (double)result / (double)args.length
1.読み込まれる整数の数については、次のような配列の長さプロパティを使用できます。
int count = args.length
これにより、配列内の要素はなくなります。そして2.平均値を計算する:あなたは正しい方法でやっています。
の代わりに:
int count = 0;
for (int i = 0; i<args.length -1; ++i)
count++;
System.out.println(count);
}
あなたはただできる
int count = args.length;
平均は、引数の合計を引数の数で割ったものです。
int res = 0;
int count = args.lenght;
for (int a : args)
{
res += a;
}
res /= count;
このコードを短くすることもできます。助けが必要かどうか試してみてください。
これが私の最初の答えです。何か問題があれば教えてください。
public class MainTwo{
public static void main(String[] arguments) {
double[] Average = new double[5];
Average[0] = 4;
Average[1] = 5;
Average[2] = 2;
Average[3] = 4;
Average[4] = 5;
double sum = 0;
if (Average.length > 0) {
for (int x = 0; x < Average.length; x++) {
sum+=Average[x];
System.out.println(Average[x]);
}
System.out.println("Sum is " + sum);
System.out.println("Average is " + sum/Average.length);
}
}
}
コマンドライン引数から整数を取得しようとしている場合は、次のようなものが必要になります。
public static void main(String[] args) {
int[] nums = new int[args.length];
for(int i = 0; i < args.length; i++) {
try {
nums[i] = Integer.parseInt(args[i]);
}
catch(NumberFormatException nfe) {
System.err.println("Invalid argument");
}
}
// averaging code here
}
実際の平均化コードに関しては、他の人がそれを微調整する方法を提案しています(したがって、彼らが言ったことを繰り返すことはしません)。
編集:実際には、上記のループ内に配置し、nums
配列をまったく使用しない方がおそらく良いでしょう。
2つの方法を紹介します。プロジェクトに多くの統計情報が必要ない場合は、以下を実装するだけです。
public double average(ArrayList<Double> x) {
double sum = 0;
for (double aX : x) sum += aX;
return (sum / x.size());
}
あなたが多くの統計を行うことを計画しているなら、車輪の再発明をしないほうがよいかもしれません。では、チェックしてみませんか http://commons.Apache.org/proper/commons-math/userguide/stat.html
あなたは本当の愛情に陥るでしょう!
古いスレッドのようですが、Javaはそれ以来進化し、Java 8でStreams&Lambdasを導入しました。したがって、Java8を使用してそれを実行したいすべての人に役立つ可能性があります。特徴。
Arrays.stream(<arr>)
を使用して実行できます。文字列配列要素のストリームを取得したら、mapToDouble(s -> Double.parseDouble(s))
を使用して、文字列のストリームをdoubleのストリームに変換できます。Stream.collect(supplier, accumulator, combiner)
を使用して平均を計算できます。ここに いくつかの良い例 があります。Collectors.averagingDouble()
を直接使用して、平均を直接計算して返します。いくつか ここの例 。