2016-04-05 5 views
0

モードを見つけるためのプログラムを作成しました。次に、"1 3 [5] 4 [5]"のような角括弧でモードを印刷するようにしましたが、配列リストにモードがない場合は、"[1] 3 4 5 "。モードがない場合、最初の整数に角括弧を表示したくありません。配列リストのモードを見つけるJavaプログラム

public static int mode(int[] array) { 
    int mode = array[0]; 
    int maxCount = 0; 
    for (int i = 0; i < array.length; i++) { 
     int value = array[i]; 
     int count = 1; 
     for (int j = 0; j < array.length; j++) { 
      if (array[j] == value) 
       count++; 
      if (count > maxCount) { 
       mode = value; 
       maxCount = count; 
      } 
     } 
    } 
    return mode; 
} 

その後、私はそれをこのように印刷:

int[] array = ... 
int mode = mode(array); 
boolean first = true; 
for (int elt : array) { 
    // print separator unless it's the first element 
    if (first) { 
     first = false; 
    } else { 
     System.out.print(' '); 
    } 
    if (elt == mode) { 
     System.out.print(elt); 
    } else { 
     System.out.print('['); 
     System.out.print(elt); 
     System.out.print(']'); 
    } 
} 
System.out.println(); 
+0

私はあなたのコードがこの出力を生成するとは思わない。投稿されたコードが正しいかどうか再確認してください( 'if'条件もチェックしてください)。 – Tom

答えて

0

あなたの機能モード()は、デフォルトでモードとして、デフォルトでは、配列の最初の要素を返しますので、あなたは要素があるかどうかを言うことができませんモードが全くない場合である。以下のように何のモードではなく、存在しないときに、あなたは0を返す関数へのわずかな変更を加えることができ、その後、あなたのコードは終わるでしょう:

class TestMode 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     int[] array = {1,3,2,4,5}; 
     int mode = mode(array); 
     for (int e : array) { 
      if ((mode!=0) && (e==mode)) { 
       System.out.print ("["+e+"]"); 
      } 
      else { 
       System.out.print(e); 
      } 
      System.out.print(" "); 
     } 
    } 

    public static int mode(int[] array) { 
     int mode = array[0]; 
     int maxCount = 0; 
     for (int i = 0; i < array.length; i++) { 
      int value = array[i]; 
      int count = 0; 
      for (int j = 0; j < array.length; j++) { 
       if (array[j] == value) count++; 
       if (count > maxCount) { 
        mode = value; 
        maxCount = count; 
        } 
       } 
     } 
     if (maxCount > 1) { 
      return mode; 
     } 
     return 0; 
    } 
} 

EDIT:には、以下の真を返す関数でありますモードセット:

public static Set<Integer> mode2(List<Integer> list) { 
    int maxFrequency = 0; 
    boolean modeFound = false; 
    Set<Integer> modeSet = new HashSet<>(); 
    Collections.sort(list); 
    for (int i=0; i<list.size(); i++) { 
     int number = list.get(i); 
     int count = 1; 
     for (; (i+count)<list.size() && list.get(i+count)==number; count++) {} 
     i+=(count-1); 
     if (maxFrequency!=0 && count!=maxFrequency) { 
      modeFound = true; 
     } 
     if (count > maxFrequency) { 
      modeSet.clear(); 
      modeSet.add (number); 
      maxFrequency = count; 
     } 
     else if (count == maxFrequency) { 
      modeSet.add(number); 
     } 
    } 
    if (!modeFound) { 
     modeSet.clear(); 
    } 
    return modeSet; 
} 
+0

実際、元の機能にあったバグが見つかりました。 "value = array [i]"の後の行でcount = 0を設定する必要があります。これが、あなたが言ったようにコードが動作していた理由です。今すぐ実行してみてください。 コメントには、モード定義を見ると、さまざまな数値の頻度が同じときに複数のモードを持つことができるため、モードの正確な定義を満たさないように見えます。例えば、{1,1,3,4,5,2,2}のモードは両方ともfreq = 2であるので、{1,2}になります。ただし、{1,1,2,2,3,3}にはモードがありません。これは、他のどの周波数よりも周波数の高いものはありません。 –

+0

私が作った編集を見ると、入力リストのモードである数字のセットが返されます。 –

+0

申し訳ありませんが、公共の静的intモード(int []配列)を使用する必要があるので、申し訳ありませんが、そのメソッドを使用することはできません – maria

0

最初の値の代わりに「モードが見つからない」という値を返す必要があります。

  1. は、Java 8を使用している場合は、そのOptional<Integer>を返すことができます:ここで(エレガンスを低下させるのに)3つのオプションがあります。それを使用する前に、値があるかどうかを明示的に確認することができます。

  2. intの代わりにIntegerを返してから、nullを使用すると「値が見つかりません」という意味になります。

  3. 0または-1などの特殊な値を使用します。これはあなたが現在行っていることですが、これらの数字の1つがあなたのサンプルの真のモードかもしれないという欠点があります。

関連する問題