私はクラスの割り当てをしていますが、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());
}
}
ヒント:int型/ int型 - > int型、質問に関連していないので、1月2日= 0 –
1つの改良:あなたがデルからバケツのサイズを変更することができますこれは、スペースを減らし余分なスペースを解放するためです。 –