2017-04-14 10 views
0

を返し、私は配列のモードを見つける必要があります。複数のモードが存在する場合は何のモードが(つまり各要素は一度だけ表示され、または同等回)リターンDouble.NaN。複数のモード場合は、タイトルの状態としてはNaN

2)が存在しない場合、すなわち{1,2,2,3,4,5,5,6}は(

1)になります。しかし、いくつかの規定がこれにあります2つのモード、2と5を返す)return Double.NaN

基本的には、配列のモードであれば基本的には配列の要素を返すだけで、他のすべての要素より少なくとも1回多く表示されます。他の時間、それは私の現在のコードは、モードを返しDouble.NaN

返す必要があります。二つの数が等しく現れる場合は、それはモードないNaNように、2つの後者を返します。何のモードが存在しない場合にも、NaNを返しません。

何か助けていただければ幸いです。ここで

は、私がこれまで持っているものです。

public double mode(){ 
    double[] holder = new double[data.length]; 
    double tempMax = 0, permMax = 0, location = 0, arrayMode = 0; 
    for (int i = 0; i < data.length; ++i) { 
     int count = 0; 
     for (int j = 0; j < data.length; ++j) { 
      if (data[j] == data[i]) 
       ++count; 
     } 
     holder[i] = count; 
    } 

    for (int w = 0; w < holder.length; w++){ 
    if (holder[w] > tempMax){ 
     tempMax = holder[w]; 
     arrayMode = data[w]; 
    } 
    } 
    permMax = arrayMode; 

    return permMax; 
} 
+0

double []パラメーター – ControlAltDel

答えて

0

この質問には重複があります。 here

言われていること、私は別のソリューションを追加したい:

public double findMode(int[] inArray) { 
     List<Integer> il = IntStream.of(inArray).boxed().collect(Collectors.toList()); 
     int maxFreq = 0; 
     double value = 0; 
     for (Integer i : ia){ 
      if (Collections.frequency(il, i) > maxFreq && i != value){ 
       maxFreq = Collections.frequency(il, i); 
       value = i; 
      } else if (Collections.frequency(il, i) == maxFreq && i != value) { 
       value = Double.NaN; 
      } 
     } 
     return value; 
} 

それはList<Integer>int[]をオンにし、それぞれの値の出現数を取得するにはCollections.frequencyメソッドを使用しています。

免責事項:私は逃したいくつかの最適化が可能性があります。

+0

リンクされたコードは何を言いますが、count = 0をcount = 1に変更することをおすすめしますか?または、ここに挙げたものを既存の方法に実装しますか? – slowdawg84

+0

リンクしたコードの最後のif-elseブランチを変更して、Double.NaNを返すようにしました。誰も助けてくれてありがとう! – slowdawg84

0

それを行うための最善の方法は、最大に対する各数のインスタンスの数を数える最初から最後まで、それを通過した後、あなたの配列をソートすることですこれまでに見つかった。数字の元の順序を維持する必要がある場合は、最初に配列を複製してください。

public static double mode (double[] data) { 
    double maxnum = Double.NaN; 
    double num = 0; 
    int maxcount = 0; 
    int count = 0; 
    double[] used = Arrays.copyOf(data, data.length); 
    Arrays.sort(data); 
    for (int i = 0; i < used.length; i++) { 
    if (used[i] == num) { 
     count++; 
    } 
    else { 
     num = used[i]; 
     count = 1; 
    } 
    if (count == maxCount) { 
     maxnum = Double.NaN; 
    } 
    if (count > maxCount) { 
     maxnum = num; 
     maxcount = count; 
    } 
    } 
    return maxnum; 
} 
+0

を使ってモードを静的メソッドにしない理由はほとんどありません。ソートと言うと、各要素の頻度を見つけて、前の最大頻度と比較します。前回より大きい場合は最大値になります。等しい場合はNaNを返し、それ以下の場合はmaxを変更しません。 – slowdawg84

+0

@ slowdawg84根本的には、 – ControlAltDel

関連する問題