web-dev-qa-db-ja.com

java

編集:平均的なコードを記述しましたが、配列ではなく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)
 }

誰かが私を正しい方向に導くことができますか?または、このコードを形作るための書き方をガイドする例を挙げてください。

前もって感謝します

4
syncoroll

コードを少し変更するだけで十分です(わかりやすくするために変数の名前を変更します)。

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 ) );
}

このアプローチにはいくつかの利点があります(多少遅くなりますが、タイムクリティカルな操作には使用しないでください)。

  • 精度は維持されます。2倍にすると、数学演算の数に応じて徐々に精度が低下します(または、数値によっては正確な精度がまったく得られません)。
  • オーバーフローの可能性は実質的に排除されます。ただし、BigDecimaldoubleまたはlongに収まるものよりも大きい場合があることに注意してください。
6
Thomas
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;
3
devconsole

この

for (int i = 0; i<args.length -1; ++i)
    count++;

基本的にargs.lengthを再度計算しますが、正しくありません(ループ条件はi<args.lengthである必要があります)。代わりにargs.length(またはnums.length)を直接使用しないのはなぜですか?

それ以外の場合、コードは問題ないようです。コマンドラインから入力を読み取りたいように見えますが、それを数値の配列に変換する方法がわかりませんが、これは本当の問題ですか?

2
Péter Török
 System.out.println(result/count) 

result/countはString型ではなく、System.out.println()はStringパラメーターのみを受け取るため、これを行うことはできません。おそらく試してみてください:

double avg = (double)result / (double)args.length
0
Jordan

1.読み込まれる整数の数については、次のような配列の長さプロパティを使用できます。

int count = args.length

これにより、配列内の要素はなくなります。そして2.平均値を計算する:あなたは正しい方法でやっています。

0
Swagatika

の代わりに:

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;

このコードを短くすることもできます。助けが必要かどうか試してみてください。

これが私の最初の答えです。何か問題があれば教えてください。

0
jDourlens
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);
      }
   }
}
0
Carter Brown

コマンドライン引数から整数を取得しようとしている場合は、次のようなものが必要になります。

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配列をまったく使用しない方がおそらく良いでしょう。

0
user837324

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

あなたは本当の愛情に陥るでしょう!

0
SARose

古いスレッドのようですが、Javaはそれ以来進化し、Java 8でStreams&Lambdasを導入しました。したがって、Java8を使用してそれを実行したいすべての人に役立つ可能性があります。特徴。

  • あなたの場合、String []であるargsをdoubleまたはintに変換したいとします。これは、Arrays.stream(<arr>)を使用して実行できます。文字列配列要素のストリームを取得したら、mapToDouble(s -> Double.parseDouble(s))を使用して、文字列のストリームをdoubleのストリームに変換できます。
  • 次に、増分計算を自分で制御する場合は、Stream.collect(supplier, accumulator, combiner)を使用して平均を計算できます。ここに いくつかの良い例 があります。
  • 平均を段階的に実行したくない場合は、JavaのCollectors.averagingDouble()を直接使用して、平均を直接計算して返します。いくつか ここの例
0
Ravi K