package com.beust.jcommander;

import com.beust.jcommander.internal.Maps;

import java.util.Map;

Helper class to perform fuzzy key look ups: looking up case insensitive or abbreviated keys.
/** * Helper class to perform fuzzy key look ups: looking up case insensitive or * abbreviated keys. */
public class FuzzyMap { interface IKey { String getName(); } public static <V> V findInMap(Map<? extends IKey, V> map, IKey name, boolean caseSensitive, boolean allowAbbreviations) { if (allowAbbreviations) { return findAbbreviatedValue(map, name, caseSensitive); } else { if (caseSensitive) { return map.get(name); } else { for (IKey c : map.keySet()) { if (c.getName().equalsIgnoreCase(name.getName())) { return map.get(c); } } } } return null; } private static <V> V findAbbreviatedValue(Map<? extends IKey, V> map, IKey name, boolean caseSensitive) { String string = name.getName(); Map<String, V> results = Maps.newHashMap(); for (IKey c : map.keySet()) { String n = c.getName(); boolean match = (caseSensitive && n.startsWith(string)) || ((! caseSensitive) && n.toLowerCase().startsWith(string.toLowerCase())); if (match) { results.put(n, map.get(c)); } } V result; if (results.size() > 1) { throw new ParameterException("Ambiguous option: " + name + " matches " + results.keySet()); } else if (results.size() == 1) { result = results.values().iterator().next(); } else { result = null; } return result; } }