2016-10-10 10 views
1

私はクラスの割り当てをしていますが、HashMapを作成してからランダムな値を入力するように要求します。最初に動的なサイズ変更を行わずに動的なサイズ変更を行い、値の小さなバケットサイズの値を保存します。ハッシュマップで平均バケット長を見つけるにはどうすればよいですか?

これを行うには、ハッシュマップ内で最短バケット長、平均バケット長、最長バケット長を見つける方法を作成するように求められます。

これは、バケツの長さを取得しようとするときに問題が発生する場所です。バケットの長さは常にゼロを返します。私のコードが理にかなって私の問題がどこにあるのか分かりません。どんな助けでも大歓迎です。

以下は、私のHashMapとそれを呼び出すメインプログラムのコードです。 Math.random()に従ってので

public class MyHashMap<K, V> { 
    private LinkedList<KVP <K, V>>[] bucket; 
    private int M = 5; 
    private int size = 0; 


    public MyHashMap(int M){ 
     this.bucket = (LinkedList<KVP<K, V>>[]) new LinkedList[M]; 
     for(int i = 0; i < M; i++){ 
      bucket[i] = new LinkedList<KVP<K, V>>(); 
     } 
    } 
    public MyHashMap(){ 
     this.bucket = (LinkedList<KVP<K, V>>[]) new LinkedList[M]; 
     for(int i = 0; i < 5; i++){ 
      bucket[i] = new LinkedList<KVP<K, V>>(); 
     } 
    } 

    public int getBucketNumber(K key){ 
     return Math.abs(key.hashCode()) % this.bucket.length; 
    } 
    public void put(K key, V value){ 
     //resize(); 
     size++; 
     int b = getBucketNumber(key); 
     for(KVP<K, V> pair : this.bucket[b]){ 
      if(pair.key.equals(key)){ 
       pair.value = value; 
       return; 
      } 
     } 
     KVP<K, V> pair = new KVP<>(key, value); 
     this.bucket[b].add(pair); 
    } 
    public int size(){ 
     return this.bucket.length; 
    } 
    public boolean isEmpty(){ 
     return size == 0; 
    } 
    public void resize(){ 
     if(size > size() * 2){ 
      LinkedList<KVP <K, V>>[] newHash = (LinkedList<KVP<K, V>>[]) new LinkedList[2 * size()]; 
      for(int i = 0; i < newHash.length; i++){ 
       newHash[i] = new LinkedList<KVP <K, V>>(); 
      } 
      for(LinkedList<KVP<K, V>> map: this.bucket){ 
       for(KVP<K, V> pair: map){ 
        int newHashCode = Math.abs(pair.key.hashCode()) % newHash.length; 
        newHash[newHashCode].add(pair); 
       } 
      } 
      this.bucket = newHash; 
     }  
    } 

    public void delete(K key){ 
     int b = getBucketNumber(key); 
     for(KVP<K, V> pair : this.bucket[b]){ 
      if(pair.key.equals(key)){ 
       key = null; 
      } 
     } 
    } 
    public boolean containsKey(K key){ 
     int b = getBucketNumber(key); 
     boolean t = false; 
     for(KVP<K, V> pair : this.bucket[b]){ 
      if(pair.key.equals(key)){ 
       t = true; 
      }else{ 
       t = false; 
      } 
     } 
      return t; 
    } 
    public V get(K key){ 
     int b = getBucketNumber(key); 
     for(KVP<K, V> pair : this.bucket[b]){ 
      if(pair.key.equals(key)){ 
       return pair.value; 
      } 
     } 
     return null; 
    } 
    public int Avg(){ 
     int j = 0; 
     for(int i = 0; i < bucket.length; i++){ 
      j += bucket[i].size(); 
     } 
     return j/bucket.length; 
    } 

} 

public class hwMain { 
    public static void main(String[] args){ 

     int N = (int) Math.pow(10, 3); 
     MyHashMap<Integer, Integer> store = new MyHashMap<>();  
     for(int i = 0; i < N; i++){ 

      store.put((int) Math.random(), 1); 
      } 
     System.out.print(store.Avg()); 
    } 
} 
+1

ヒント:int型/ int型 - > int型、質問に関連していないので、1月2日= 0 –

+0

1つの改良:あなたがデルからバケツのサイズを変更することができますこれは、スペースを減らし余分なスペースを解放するためです。 –

答えて

0

は以上 0.0と1.0未満に等しい正の符号、でdouble値を返します。これを行うと数以来

は、常に1.0以下である:

(int) Math.random() 

これは常に0(ゼロ)を返します。

ソリューション:

あなたは、ランダムな数字と最小値の範囲を持っている場合は、これを使用します。たとえば

(int) (Math.random() * range) + minimum 

:あなたは1から100までの乱数をしたいです。

(int) (Math.random() * 100) + 1 
+0

ソート前にキーがハッシュコードの計算に使用されているだけなので、実際の値は1バケットあたりのキーバリューペアの平均数に影響しませんバケツ。まあ私は彼らが意味するが、彼らはランダムであるので、それはバケットあたりの平均にはあまり影響しないはずです。 – HDHobo

+0

'put'の全てに対して、' key'の値は0になります。これは問題ではありませんか? – Shahid

+0

私はあなたが今何を意味しているのか理解していますが、最小値と範囲を追加すると毎回20の値が返されるので、それが問題であるかどうかわかりません。 – HDHobo

関連する問題