>

키에 대한 색인을 찾기 위해 선형 프로빙을 수행하는 해시 맵을 작성 중입니다. 키가 이미 인덱스에 있으면 새 인덱스에 키를 추가하지 않고 값을 늘리고 싶습니다.

예를 들어, 문자열 "five, five, five"에 대한 단어 개수를 얻는 경우 출력은 5 3 대신 5 1, 5 1, 5 1입니다.

내 키가 이미 맵에 있는지 확인하기 위해 get 메소드를 사용하는 containsKey 메소드라고 생각합니다. 아래는 내 Hashmap.java 클래스입니다.

import java.util.Hashtable;
import java.util.ArrayList;
import java.lang.Object;
public class Hashmap<K,V> implements MapSet<K,V>
{
    private Object hashMap[]; //hash table
    private int capacity; // capacity == table.length
    private int collisions; // number of collisions
    private int numItems; // number of hash table entries

    public Hashmap(int arrayCapacity){
        capacity = arrayCapacity;
        hashMap = new Object[capacity];
        collisions = 0;
        numItems = 0;
    }
    //Returns true if the map contains a key-value pair with the given key
    @SuppressWarnings({"unchecked"})
    public boolean containsKey( K key ){
        return get(key) != null;    
    }

    @SuppressWarnings({"unchecked"})
    public V put(K key, V value){
        int hash = Math.abs(key.hashCode());
        int index = hash% hashMap.length; //getting a new index for the key-value-pair
        KeyValuePair<K,V> pair = (KeyValuePair<K,V>) hashMap[index];
        while(pair != null && !pair.getKey().equals(key)){
            index = (index+1)% hashMap.length;
            pair = (KeyValuePair<K,V>)hashMap[index];
            collisions++;           
        }
        if (pair == null){
            //a null spot has been found, the key value pair will be added here.
            KeyValuePair<K,V> temp = new KeyValuePair<K,V>(key,value);
            hashMap[index] = temp;
            numItems++;
            if (numItems > hashMap.length / 2) {
                ensureCapacity();
            }
        return value;
        }
        else {
            //the key is the same as one already in the hashmap.
            //sets the value of the new key to the old key.
            V oldValue = pair.getValue();
            pair.setValue(value);
            return oldValue;
        }
    }
    @SuppressWarnings({"unchecked"})    
     public V get(K key){
        int hash = Math.abs(key.hashCode());
        int index = hash% hashMap.length;
        KeyValuePair<K,V> pair = (KeyValuePair<K,V>) hashMap[index];
        if(pair == null){
            return null;
        }
        else if(pair.getKey() == key){
            return pair.getValue();
        }
        else{
            index = (index + 1)% hashMap.length;
            int progress = 0;
                while(hashMap[index] != null){
                    progress++;
                    KeyValuePair<K,V> item = (KeyValuePair<K,V>) hashMap[index];
                    if(item.getKey().equals(key)) 
                        return item.getValue();
                    if (progress == hashMap.length) 
                        break;
                }       
            return null;
        }
     }


  • 답변 # 1

    이 예 참조

    import java.util.*;
    import java.lang.*;
    import javax.swing.JOptionPane;
    import java.io.*;
    public class TestingTables
    {
       public static void main(String args[])
       {
          {
          String s = "Any text for word word count";
          String[] splitted = s.split(" ");
          Map<String, Integer> hm = new HashMap<String, Integer>();
          int x;
          for (int i=0; i<splitted.length ; i++) {
             if (hm.containsKey(splitter[i])) {
                int cont = hm.get(splitter[i]);
                hm.put(splitter[i], cont + 1)
             } else {
                hm.put(splitted[i], 1);
             }
          }
       }
    }
    
    

  • 이전 c# - NPOI가 0 바이트 스트림을 생성 중입니다
  • 다음 multithreading - 글타래 (쓰레드 1) - 풀기/스위프트 중에 없음을 발견 함