All Downloads are FREE. Search and download functionalities are using the official Maven repository.

craterdog.collections.Dictionary Maven / Gradle / Ivy

/************************************************************************
 * Copyright (c) Crater Dog Technologies(TM).  All Rights Reserved.     *
 ************************************************************************
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.        *
 *                                                                      *
 * This code is free software; you can redistribute it and/or modify it *
 * under the terms of The MIT License (MIT), as published by the Open   *
 * Source Initiative. (See http://opensource.org/licenses/MIT)          *
 ************************************************************************/
package craterdog.collections;

import craterdog.collections.abstractions.AssociativeCollection;
import craterdog.collections.abstractions.Collection;
import craterdog.collections.abstractions.OpenCollection;
import org.slf4j.ext.XLogger;
import org.slf4j.ext.XLoggerFactory;


/**
 * This collection class is a convenience class that implements an associative collection
 * whose keys are always of type String.  The implementation dynamically
 * scales up and down the size of the underlying data structures as the number elements
 * changes over time.
 *
 * @author Derk Norton
 * @param  The type of the value in the association.
 */
public final class Dictionary extends AssociativeCollection {

    static private final XLogger logger = XLoggerFactory.getXLogger(Dictionary.class);


    /**
     * This constructor creates a new empty dictionary.
     */
    public Dictionary() {
        super();
    }


    /**
     * This constructor creates a new dictionary using the specified key and value arrays.  The
     * number of keys must equal the number of values or an exception is thrown.
     *
     * @param keys The array of keys that should be used to create the dictionary.
     * @param values The array of values that should be used to create the dictionary.
     */
    public Dictionary(String[] keys, V[] values) {
        super(keys, values);
    }


    /**
     * This constructor creates a new dictionary using the specified keys and values.  The
     * number of keys must equal the number of values or an exception is thrown.
     *
     * @param keys The keys that should be used to create the dictionary.
     * @param values The values that should be used to create the dictionary.
     */
    public Dictionary(Collection keys, Collection values) {
        super(keys, values);
    }


    /**
     * This constructor creates a new dictionary using the elements provided in the specified map.
     *
     * @param elements The dictionary containing the key-value pairs to be mapped.
     */
    public Dictionary(AssociativeCollection elements) {
        super(elements);
    }


    /**
     * This constructor creates a new dictionary using the elements provided in a java map.
     *
     * @param elements The java map containing the key-value pairs to be mapped.
     */
    public Dictionary(java.util.Map elements) {
        super(elements);
    }


    @Override
    protected >> T emptyCopy() {
        @SuppressWarnings("unchecked")
        T copy = (T) new Dictionary<>();
        return copy;
    }


    /**
     * This function returns a new dictionary that contains the all the associations from
     * both the specified dictionaries.
     *
     * @param  The type of value contained in the dictionaries.
     * @param dictionary1 The first dictionary whose elements are to be added.
     * @param dictionary2 The second dictionary whose elements are to be added.
     * @return The resulting dictionary.
     */
    static public  Dictionary concatenation(Dictionary dictionary1, Dictionary dictionary2) {
        logger.entry(dictionary1, dictionary2);
        Dictionary result = new Dictionary<>(dictionary1);
        result.addElements(dictionary2);
        logger.exit(result);
        return result;
    }


    /**
     * This function returns a new dictionary that contains only the associations with
     * the specified keys.
     *
     * @param  The type of value contained in the dictionaries.
     * @param dictionary The dictionary whose elements are to be reduced.
     * @param keys The set of keys for the associates to be saved.
     * @return The resulting dictionary.
     */
    static public  Dictionary reduction(Dictionary dictionary, Set keys) {
        logger.entry(dictionary, keys);
        Dictionary result = new Dictionary<>();
        for (String key : keys) {
            V value = dictionary.getValue(key);
            if (value != null) {
                logger.debug("Associating key: {} with value: {}", key, value);
                Association association = new Association<>(key, value);
                result.addElement(association);
            }
        }
        logger.exit(result);
        return result;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy