0

我有一个 BiMap,其中一个字符串作为键,一个字符串数组作为值。现在我正在尝试使用单个字符串(它是值数组的一部分)来获取密钥。

private static BiMap<String, String[]> map = ImmutableBiMap.<String, String[]>builder().build();
static {
    map.put("000", new String[] {"CH", "CHE", "Switzerland"});
    map.put("001", new String[] {"US", "USA", "United States of America"});
    map.put("002", new String[] {"IT", "ITA", "Italy"});
}

在下一个方法中,我试图用“CH”搜索以获得“000”(这不起作用)。

private static String getKey(Map<String,String[]> map, String find) {
    Map<String[], String> inversedMap = map.inverse();
    if(inversedMap.containsKey() {
        return inversedMap.get(find);
    }
    return null;
}

有没有办法像这样“找到”密钥,没有我需要用这样的数组搜索:String[] find = new String[] {"CH", "CHE", "Switzerland"};

所有的值和键都是唯一的,因此预计只有一个结果。我总是在寻找数组中的第一个值,f.ex。“中国”或“美国”。

4

2 回答 2

2

不,没有办法找到你想要的钥匙。您必须更改存储数据的方式以支持所需的所有不同查找方法,或者逐个遍历所有键(此时制作逆映射毫无意义,您只需遍历 Map 条目)。

一个简单的方法是专门构建一个包含多个地图的类。

于 2019-09-12T06:18:02.303 回答
1

万一你有案子找smth。按值(不是按键),那么您可以for loop在不担心性能的情况下使用。否则,您应该用包装器包装它并BiMap添加附加:Mapval -> key

public final class CountryCache {

    private final Map<String, String[]> codeNames = new HashMap<>();
    private final Map<String, String> nameCode = new HashMap<>();

    {
        codeNames.put("000", new String[] { "CH", "CHE", "Switzerland" });
        codeNames.put("001", new String[] { "US", "USA", "United States of America" });
        codeNames.put("002", new String[] { "IT", "ITA", "Italy" });

        codeNames.forEach((code, names) -> Arrays.stream(names).forEach(name -> nameCode.put(name, code)));
    }

    private static final CountryCache INSTANCE = new CountryCache();

    public static CountryCache getInstance() {
        return INSTANCE;
    }

    private CountryCache() {
    }

    public String findByName(String name) {
        return nameCode.get(name);
    }

}
于 2019-09-12T06:50:07.793 回答