gpt4 book ai didi

java - 滚动我自己的对象以将 Map 替换为 Map,String>

转载 作者:行者123 更新时间:2023-12-01 16:59:33 25 4
gpt4 key购买 nike

我正在尝试使用以下数据结构:

//all the words in each file as index, the label as value
static Map< ArrayList<String> , String > train__list_of_file_words = new HashMap<>();
static Map< ArrayList<String> , String > test__list_of_file_words = new HashMap<>();

//frequency count against global dictionary
static Map< int[] , String > train_freq_count_against_globo_dict = new HashMap<>();
static Map< int[] , String > test_freq_count_against_globo_dict = new HashMap<>();

但我被告知这是没有意义的,因为它们与 equals() 结合使用时不能顺利工作并且是可变的。

我想解决方案是编写我自己的对象以类似的方式存储该信息,但我以前从未这样做过。怎么做?

最佳答案

由于没有人站出来完整回答您的问题,我会尝试一下:

使用 Map< ArrayList<String> , String >

这种方法的问题在于 ArrayList<String>是可变的。例如,请参阅此示例:

Map<ArrayList<String>, String> map = new HashMap<>();

ArrayList<String> l = new ArrayList<>();
l.add("a");
l.add("b");

map.put(l, "Hello");
System.out.println(map.get(l)); // "Hello";

l.add("c"); // Mutate key.
System.out.println(map.get(l)); // null (value lost!)

进一步阅读:

使用 Map< int[] , String >

这是可能的,但可能会令人困惑,因为两个数组可能看起来相等,但 .equals 却不然。彼此。考虑以下示例:

Map<int[], String> map = new HashMap<>();

int[] arr1 = { 1, 2 };
map.put(arr1, "Hello");

int[] arr2 = { 1, 2 };
System.out.println(map.get(arr2)); // null, since arr1.equals(arr2) == false

因此,要检索以前插入的值,您需要使用相同的实例作为键。上面的示例仅在您使用 map.get(arr1) 时才有效。 .

那么该怎么办?

  • 您可以按照您的建议,推出自己的数据结构来跟踪私有(private)数据结构中的映射。例如,您可以使用 Map<List<...>, String>作为支持结构,但请确保您永远不会改变您在该映射中使用的键(例如,保持映射私有(private)并且永远不会发布对 List 键的引用)。

  • 如果您事先知道键的大小,则可以使用嵌套映射,如下所示:Map<String, Map<String, String>> .

  • 您可以使用第三方集合库,例如 Guava 或 Apache Commons。他们有一个名为 Table 的数据结构。分别。 MultiKeyMap 这两者似乎都符合您的要求。

  • 您可以按照 @dasblinkenlight 的建议创建一个新的、不可变的关键对象。 (请注意;这是安全的,因为 String 是不可变的!)代码可以稍微简化如下:

    final class StringTuple {
    private String[] vals;

    public StringTuple(String... vals) {
    this.vals = vals.clone();
    }

    public int hashCode() {
    return Arrays.hashCode(vals);
    }

    public boolean equals(Object obj) {
    return (obj instanceof StringTuple)
    && Arrays.equals(vals, ((StringTuple) obj).vals);
    }
    }

关于java - 滚动我自己的对象以将 Map<int[],String> 替换为 Map<ArrayList<String>,String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28744206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com