2 minute read

맵 인터페이스

/**
 * @author andpact
 * @param <K> the type of key elements in this map
 * @param <V> the type of value elements in this map
 */
public interface MapInterface<K, V> {
    /**
     * 지정된 Key를 가진 Value를 삽입합니다.
     * @param key Key로 사용할 요소
     * @param val Value로 사용할 요소
     */
    void add(K key, V val);

    /**
     * 지정된 Key를 가진 Value를 반환합니다.
     * @param key Key로 사용할 요소
     * @return 지정한 Key를 가진 Value
     */
    V get(K key);

    /**
     * 지정된 Key를 가진 Value를 지정된 Value로 변경합니다.
     * @param key Key로 사용할 요소
     * @param val 새 Value로 사용할 요소
     */
    void set(K key, V val);

    /**
     * 지정된 Key를 가진 Value를 제거합니다.
     * @param key Key로 사용할 요소
     */
    void remove(K key);

    /**
     * 모든 요소를 제거합니다.
     */
    void clear();

    /**
     * 지정된 Value를 포함하는지 조회합니다.
     * @param val 포함 여부를 조회할 요소
     * @return 지정된 요소르 포함하고 있다면 true를 반환
     */
    boolean contains(V val);

    /**
     * map이 비었는지 조회합니다.
     * @return map이 비었다면 true를 반환
     */
    boolean isEmpty();

    /**
     * 요소의 개수를 반환합니다.
     * @return 요소의 개수
     */
    int size();
}

생성자

public class Map<K, V> implements MapInterface<K, V>{
    private K[] keyArr;
    private V[] valArr;
    private final static int DEFAULT_CAPACITY = 10;
    private int size;

    public Map() {
        keyArr = (K[]) new Object[DEFAULT_CAPACITY];
        valArr = (V[]) new Object[DEFAULT_CAPACITY];
        size = 0;
    }
}

CREATE 메서드

@Override
public void add(K key, V val) {
    resize();
    for (int i = 0; i < size; i++) {
        if (keyArr[i].equals(key)) return;
    }
    keyArr[size] = key;
    valArr[size] = val;
    size++;
}

READ 메서드

@Override
public V get(K key) {
    for (int i = 0; i < size; i++) {
        if (keyArr[i].equals(key)) {
            return valArr[i];
        }
    }
    return null;
}

UPDATE 메서드

@Override
public void set(K key, V val) {
    for (int i = 0; i < size; i++) {
        if (keyArr[i].equals(key)) {
            valArr[i] = val;
        }
    }
}

DELETE 메서드

@Override
public void remove(K key) {
    for (int i = 0; i < size; i++) {
        if (keyArr[i].equals(key)) {
            for (int j = i; j < size - 1; j++) {
                keyArr[i] = keyArr[i + 1];
                valArr[i] = valArr[i + 1];
            } size--;
            resize();
            return;
        }
    }
}

@Override
public void clear() {
    keyArr = (K[]) new Object[DEFAULT_CAPACITY];
    valArr = (V[]) new Object[DEFAULT_CAPACITY];
    size = 0;
}

기타 메서드

@Override
public boolean contains(V val) {
    for (int i = 0; i < size; i++) {
        if (valArr[i].equals(val)) return true;
    }
    return false;
}

@Override
public boolean isEmpty() {
    return size == 0;
}

@Override
public int size() {
    return size;
}

private void resize() {
    if (size == keyArr.length){
        keyArr = Arrays.copyOf(keyArr, keyArr.length * 2);
        valArr = Arrays.copyOf(valArr, valArr.length * 2);
    }
    else if (size < keyArr.length / 2) {
        keyArr = Arrays.copyOf(keyArr, Math.max(DEFAULT_CAPACITY, keyArr.length / 2));
        valArr = Arrays.copyOf(valArr, Math.max(DEFAULT_CAPACITY, valArr.length / 2));
    }
}

Leave a comment