package com.levelup.java.collections;

import static org.junit.Assert.assertEquals;

import org.apache.commons.collections.BidiMap;
import org.apache.commons.collections.bidimap.DualHashBidiMap;
import org.apache.log4j.Logger;
import org.junit.Test;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

/**
 * This java example will demonstrate how to perform a reverse key lookup.
 * 
 * @author Justin Musgrove
 * @see <a href=
 *      'http://www.leveluplunch.com/java/examples/reverse-map-lookup-flip-key-values-bimap/'>Reverse
 *      map lookup - How to get key from value?</a>
 */
public class ReverseMapLookup {

	private static final Logger logger = Logger
			.getLogger(ReverseMapLookup.class);

	@Test
	public void flip_map_entries_with_guava() {

		BiMap<String, String> stateCodeToDescription = HashBiMap.create();

		stateCodeToDescription.put("WI", "Wisconsin");
		stateCodeToDescription.put("MN", "Minnesota");
		stateCodeToDescription.put("FL", "Florida");
		stateCodeToDescription.put("IA", "Iowa");
		stateCodeToDescription.put("OH", "Ohio");

		BiMap<String, String> descriptionToStateCode = stateCodeToDescription
				.inverse();

		logger.info(descriptionToStateCode);

		assertEquals("WI", descriptionToStateCode.get("Wisconsin"));
	}

	@Test
	public void flip_map_entries_with_apachecommons() {

		BidiMap stateCodeToDescription = new DualHashBidiMap();

		stateCodeToDescription.put("WI", "Wisconsin");
		stateCodeToDescription.put("MN", "Minnesota");
		stateCodeToDescription.put("FL", "Florida");
		stateCodeToDescription.put("IA", "Iowa");
		stateCodeToDescription.put("OH", "Ohio");

		BidiMap descriptionToStateCode = stateCodeToDescription
				.inverseBidiMap();

		logger.info(descriptionToStateCode);

		assertEquals("IA", descriptionToStateCode.get("Iowa"));
	}

}