2011-11-03 16 views
0

私は1000の数字を持っており、私はバイナリツリーを作り、ツリーをソートします。それは0から100を印刷し、他の899の数字は重複しています。どうすれば各番号の頻度を追跡できますか。例えば28という数字は9回現れます。何とかカウントを保持する。私は1つの方法で作業してきましたが、それが近いかどうかはIdkです。私はその方法を最後に投稿します。重複する番号を見つけてその番号の周波数を表示する方法

public class bigTree { 
int data; 
int frequency; 
bigTree Left, Right; 


public bigTree makeTree(int x) { 
    bigTree p; 
    p = new bigTree(); 
    p.data = x; 
    p.Left = null; 
    p.Right = null; 

    return p; 
} 


public void setLeft(bigTree t, int x) { 

    if (t.Left != null) { 
     // setLeft(t.Left, x); 
     System.out.println("Error"); 
    } 
    else { 


     t.Left = makeTree(x); 
    } 

} 


public void setRight(bigTree t, int x) { 

    if (t.Right != null) { 
     //setRight(t.Right, x); 
     System.out.println("Error"); 
    } else { 


     t.Right = makeTree(x); 
    } 
} 

public void insertLocation(bigTree tree, int v) { 

    // if (tree.data == v) { 

     //findDuplicate(v); 
//} 

    if (v < tree.data) { 
     if (tree.Left != null){ 
      insertLocation(tree.Left, v); 
     } 
     else { 
      setLeft(tree, v); 
     } 
    } 
    if (v > tree.data) { 
     if (tree.Right != null){ 
      insertLocation(tree.Right, v); 
     } else { 
     setRight(tree, v); 
     } 
    } 

    } 


    public void sort(bigTree t) { 

    if (t.Left != null) { 
     sort(t.Left); 

    } 
    System.out.println(t.data + " freq = " + frequency); 

    if (t.Right != null) { 
     sort(t.Right); 
    } 

    } 

public void dealArray(String[] x) { 
    int convert; 

    bigTree tree = makeTree(Integer.parseInt(x[0])); 

    for (int i = 1; i < x.length; i++){ 
     //convert = Integer.parseInt(x[i]); 

     insertLocation(tree, Integer.parseInt(x[i])); 
     findDuplicate(Integer.parseInt(x[i])); 

    } sort(tree); 
} 

----私は仕事ができると思った方法が、イマイチ----

  public void findDuplicate(int number) { 
bigTree tree, h, q; 


tree = makeTree(number); 
    //while (//there are #'s in the list) { //1st while() 

     h = tree; 
     q = tree; 

     while (number != h.data && q != null) { //2nd while() 
      h = q; 

      if (number < h.data) { 
       q = q.Left; 

      } else { 
       q = q.Right; 
      } 
     } //end of 2nd while() 

     if (number == h.data) { 
      //h.frequency++; 
      System.out.println("Duplcate: " + number + "freq = " + h.frequency++); 

     } 
     else { 
      if (number < h.data) { 
       setLeft(h,number); 
      } 
      else { 
       setRight(h, number); 
      } 

     } 
//} // End of 1st while() 
     sort(h); 

} 
+0

メソッドが機能していないと言っているときに、どういう意味があるのか​​説明できますか? –

+0

宿題のような音です。私は、数字としての数字と出現回数を値として使っています。 – Laf

+0

これが宿題であれば、そのようにタグ付けする必要があります。 – Thom

答えて

0

だから、あなたがする必要がある最初の事は値を表すことができるデータ構造を選択していますそれが持つ複製の数心に来る最初の事は地図

Map<Integer,Integer> //あなたの配列(またはを解析として発生する必要があるかそう値

でキーとカウントです整数を追跡していますどんな構造体からでもこの値を読み込んでいます)は、次のようにマップのチェックを行います。
myMap.contains(integerToCheck);

if contains trueを返すと、そのキーのmyMapに格納されている値を増やす必要があります。それ以外の場合は、integerToCheckと新しい値1を使用する新しいキーを挿入する必要があります。

for(Map.Entry<Integer,Integer> entry: myMap.entrySet()) 
{ 
    System.out.println(entry.getKey + " : " + entry.getValue()); 
} 
+0

返信ありがとう、これはやりにくいとは思わない。私の先生がこのやり方を受け入れるなら、唯一の問題はIdkです。私が最後に投稿した方法は彼が私たちに与えた方法ですが、私はそれを働かせることはできません。 – TMan

+0

マップを使用して頻度を格納することは、この問題の最適な解決策ではありません。最初に可能な数値分布の半分でMapはint配列よりも多くのメモリを取ります。このメソッドを使用すると2番目に頻度が0のすべての数値が失われ、3番目に追加チェックが追加されます。より良い解決策は、int配列を使用し、単に必要なインデックスをインクリメントすることです。 –

+0

'int []'は、値の範囲がかなり小さい場合、カウンタを保持するためだけに有効です。さもなければあなたの配列は 'new int [Integer.MAX_VALUE];' –

1

PrePost:

その後、あなたは次の操作を行いますそれらの値を印刷する を使用すると、バイナリツリーの検索を使用する必要がある場合、あなたのコードは、上記のそれぞれの新しいツリーを作成していることが表示されます要素を探しています。代わりに、探している各要素の追加/更新を行う単一のツリーが必要です。

前の投稿: @ Woot4Mooの回答は機能しますが、カウントを作成して増分するオーバーヘッドがあります。 GuavaのListMultimapクラスを使用して、これをすべて処理することをお勧めします。 ListMultimap

ListMultimap<Integer, Integer> mymap; 
for (Integer value : values){ 
    mymap.put(value, value); 
} 

Map<Integer, List<Integer>> asmap = mymap.asMap(); 
for (Entry<Integer, List<Integer>> entry : asmap.entrySet()){ 
    System.out.println(String.format("Value %d occurred %d times", entry.getKey(), entry.getValue().size()); 
} 
+0

彼の教授が第三者の図書館を利用させるならば、私はショックを受けるだろう – Woot4Moo

+0

おそらく、教授に依存する。 ListMultimapとMapの違いはありませんが、私の呼び出しではありません。 ;)しかし、私はTreeソリューションに対処するために投稿を更新しました。 –

+0

も、実際には私はしません。 – Woot4Moo

0

私は正しい方向にあなたの見出しを考えます。

1)要素を並べ替える必要があります。これを行うにはいくつかの方法があります。 enter link description here

2)重複する要素を見つける必要があります。これは、i番目の要素とi + 1番目の要素を比較することで実行できます。マップに回答を保存することができます。

関連する問題