2012-02-25 6 views
2

私は配列のモードを見つける必要があるタスクがあります。これは私が最も頻繁にintを探していることを意味します。私はちょっとやっているが、同じことが2つある場合は、最小のintを返さなければならないと言っている。例えば、{1,1,1,2,2,2}は1を与えるべきである。私はその配列を使用し、あなたは私のアルゴリズムが最後見つけモードまたはどのように私はそれを説明する必要がありますを返す見るように、それは2)javaプログラミング&配列のモードを見つける

public class theMode 
{ 
public theMode() 
{ 
    int[] testingArray = new int[] {1,1,1,2,2,2,4}; 
    int mode=findMode(testingArray); 
    System.out.println(mode); 
} 

public int findMode(int[] testingArray) 
{ 
    int modeWeAreLookingFor = 0; 
    int frequencyOfMode = 0; 

    for (int i = 0; i < testingArray.length; i++) 
    { 
     int currentIndexOfArray = testingArray[i]; 
     int frequencyOfEachInArray = howMany(testingArray,currentIndexOfArray); 

     if (frequencyOfEachInArray > frequencyOfMode) 
     { 
      modeWeAreLookingFor = currentIndexOfArray; 
      frequencyOfMode = modeWeAreLookingFor; 

     } 
    } 
    return modeWeAreLookingFor; 
    } 

public int howMany(int[] testingArray, int c) 
{ 
    int howManyOfThisInt=0; 
    for(int i=0; i < testingArray.length;i++) 
    { 
     if(testingArray[i]==c){ 
      howManyOfThisInt++; 
     } 
    } 
    return howManyOfThisInt; 
} 


public static void main(String[] args) 
{ 
    new theMode(); 
} 
} 

を与えます。

答えて

0

少し修正しても機能するかもしれません。完成し

http://www.toves.org/books/java/ch19-array/index.html#fig2

if ((count > maxCount) || (count == maxCount && nums[i] < maxValue)) { 
    maxValue = nums[i]; 
    maxCount = count; 
} 
+0

ええ、私は先生に助けを借りて解決しました。変更中に役立ったのは、for-loop内のすべての変数を含むプリントだったので、フォローアップすることができました。完全なコードは、おそらく私を助けたので、あなたの助けを借りて、新しい返信として置かれます。 –

1

ヒント:厳密に高い頻度の整数を見つけたらModeWeAreLookingForを更新しています。 ModeWeAreLookingForと同じ周波数を持つ整数を見つけるとどうなりますか?

エクストラエクササイズ:メインループ実行の最初の反復で、 '1'の頻度を計算します。 2番目の繰り返し(3番目と4番目)では、この値を再計算します。最初の計算結果を保存すると時間が節約されます。 Mapで行うことができます。

Javaコード規約では、メソッド名と変数名は小文字で始まると記載されています。このコンベンションに従うと、より良い構文の色付けとコードが読みやすくなります。

+0

を:)そう私はそれが1つのIM出力しているので、それは、その時点で何かを持って理解しています。 howManyをループしているときに、抽象的な視覚化が難しいと思っています。 –

+0

あなたは私をもっと助けてくれますか? –

1

私は別の方法でアプローチします。マップを使用すると、各一意の番号をキーとして使用し、次にその値を値として使用することができます。配列をステップ実行し、見つかった各番号について、マップをチェックして、その値を持つキーがあるかどうかを確認します。見つかった場合は値を1増やし、それ以外の場合は1の値で新しいエントリを作成します。

次に、各マップエントリの値を調べて、どれが最大のものかを調べることができます。現在のキーのカウントが前のキーのカウントよりも高い場合は、「現在の」答えです。しかし、同様のカウントを持つキーの可能性があるので、それぞれの「勝ち」の答えを保存する必要があります。

これにアプローチする1つの方法は、各エントリの各マップを確認し、現在の最高カウント未満の各エントリを削除することです。あなたが残すのは、すべての "最高の数"の地図です。あなたが1つのエントリしか持っていなければ、そのキーが答えです。そうでなければ、最も低いものを決定するためにキーのセットを比較する必要があります。

+0

私はハッシュマップbeforで試したが、私はそれが非常に厄介であることがわかった。また、キー/値を取得するPythonのように便利ではないので、私はそれを1つの配列でこのように保つようにしています。 入力していただきありがとうございます。私はこの方法で解決したいと思いますが、方法はありますか? –

+0

もう1つの答えが示唆しているように、データを格納する方法が必要です。配列の配列を格納することもできます(位置0は数字、位置1はカウント)が、これは実際にMapのためのものです。どちらの構造を選んでも、nの現在のカウントが同じカウントであるかどうかを判断できるようにデータを保存する必要があります。現在の数値が同じカウントの前の数値よりも小さいかどうかを判断できます。たぶん、コーディングの前に擬似コードでアルゴリズムを言葉で表現した場合、あなたのアプローチについて考えるのに役立つかもしれません。 – Romski

+0

ok、私はそれをしたと言うことができます。 にHashMap を置き、新しいすべての整数をHashMap に入れ、hashMpの2番目のインデックスのHashMap.containsKeyを増やすとループします。それでもなお、キー値にアクセスするのは難しいです。私がアクセスできるのは.get(theInteger)の値だけです。それは "私"の方法を解決することは不可能ですか? –

0

結局のところ、ハッシュマップをやりました。私は、周波数を比較する際には論理にもう一度立ち往生し、等しい周波数の場合には、同じ時間に最低の整数を選びます。

 public void theMode() 
    { 
     for (Integer number: intAndFrequencyMap.keySet()) 
     { 
      int key = number; 
      int value = intAndFrequencyMap.get(number); 
      System.out.println("the integer: " +key + " exists " + value + " time(s)."); 
      int lowestIntegerOfArray = 0; 
      int highestFrequencyOfArray = 0; 
      int theInteger = 0; 
      int theModeWanted = 0; 

      if (value > highestFrequencyOfArray) 
      { 
       highestFrequencyOfArray = value; 
       theInteger = number; 
      } 
      else if (value == highestFrequencyOfArray) 
      { 
       if (number < theInteger) 
       { 
        number = theInteger; 
       } 
       else if (number > theInteger) 
       { 

       } 
       else if (number == theInteger) 
       { 
        number = theInteger; 
       } 
      } 
     } 
    } 
0

あなたはそれを解決することができてうれしいです。今見てきたように、問題にアプローチする方法は複数あります。ここで私はマップを使って何を意味したのですか?

package util; 

import java.util.HashMap; 
import java.util.Map; 

public class MathUtil { 

    public static void main(String[] args) { 
     MathUtil app = new MathUtil(); 
     int[] numbers = {1, 1, 1, 2, 2, 2, 3, 4}; 
     System.out.println(app.getMode(numbers)); 
    } 

    public int getMode(int[] numbers) { 
     int mode = 0; 
     Map<Integer, Integer> numberMap = getFrequencyMap(numbers); 

     int highestCount = 0; 

     for (int number : numberMap.keySet()) { 
      int currentCount = numberMap.get(number); 

      if (currentCount > highestCount) { 
       highestCount = currentCount; 
       mode = number; 
      } else if (currentCount == highestCount && number < mode) { 
       mode = number; 
      } 
     } 

     return mode; 
    } 

    private Map<Integer,Integer> getFrequencyMap(int[] numbers){ 
     Map<Integer, Integer> numberMap = new HashMap<Integer, Integer>(); 

     for (int number : numbers) { 
      if (numberMap.containsKey(number)) { 
       int count = numberMap.get(number); 
       count++; 
       numberMap.put(number, count); 
      } else { 
       numberMap.put(number, 1); 
      } 
     } 

     return numberMap; 
    } 
} 
0

:fix'd

import java.util.Arrays; 

public class TheMode                         
{ 
    //Probably not the most effective solution, but works without hashmap 
    //or any sorting algorithms 

public TheMode() 
{ 
    int[] testingArray = new int[] {2,3,5,4,2,3,3,3}; 
    int mode = findMode(testingArray); 
    System.out.println(Arrays.toString(testingArray)); 
    System.out.println("The lowest mode is: " + mode); 

    int[] test2 = new int[] {3,3,2,2,1}; 
    int mode2=findMode(test2); 
    System.out.println(Arrays.toString(test2)); 
    System.out.println("The lowest mode is: " +mode2); 

    int[] test3 = new int[] {4,4,5,5,1}; 
    int mode3 = findMode(test3); 
    System.out.println(Arrays.toString(test3)); 
    System.out.println(The lowest mode is: " +mode3); 
} 

public int findMode(int[] testingArray) 
{ 
    int modeWeAreLookingFor = 0; 
    int frequencyOfMode = 0; 

    for (int i = 0; i < testingArray.length; i++) 
    { 
     int currentIndexOfArray = testingArray[i]; 
     int countIntegerInArray = howMany(testingArray, currentIndexOfArray); 

     if (countIntegerInArray == frequencyOfMode) 
     { 
      if (modeWeAreLookingFor > currentIndexOfArray) 
      { 
       modeWeAreLookingFor = currentIndexOfArray; 
      } 
     } 

     else if (countIntegerInArray > frequencyOfMode) 
     { 
      modeWeAreLookingFor = currentIndexOfArray; 
      frequencyOfMode = countIntegerInArray;    
     } 

    } 
    return modeWeAreLookingFor; 
    } 

public int howMany(int[] testingArray, int c) 
{ 

    int howManyOfThisInt=0; 
    for(int i=0; i < testingArray.length;i++) 
    { 
     if(testingArray[i]==c){ 
      howManyOfThisInt++; 

     } 
    } 
    return howManyOfThisInt; 
} 


public static void main(String[] args) 
{ 
    new TheMode(); 
} 
} 
関連する問題