gpt4 book ai didi

Java映射,少数按键冲突,解决方法

转载 作者:行者123 更新时间:2023-12-01 09:14:45 29 4
gpt4 key购买 nike

因此,我正在处理大约 4,000 个对象,我需要将这些对象的 ID 映射到对象。

    private HashMap<Foo, Bar> fooBar;

问题是,大约有 34、35 次出现键冲突,其中两个项目将具有相同的键。对此我能做什么?我不想做

    private HashMap<Foo, List<Bar>> fooBar;

由于该列表 99% 的时间都不会被使用,而且我有一些资源限制。解决这个问题的标准方法是什么?

最佳答案

您有多种选择:

  1. 使用Map<Foo, List<Bar>> 。您提到资源限制,但是说真的,如果 4000 List对象太多,那么您需要更改硬件:-)

  2. 使用常用的多 map 实现之一。其中许多使用映射值的某种变体作为列表,因此这主要只是实现第一个选项的更简单的方法。

  3. 更改 Bar 的实现以支持复合 Material 。这可能非常有效,因为非复合子类可以只返回自身。但它混淆了类设计和实现细节(假设 Bar 不是天然的复合体)。

  4. 添加一个支持单个或多个的新类 Bar对象并映射到该类。

例如:

interface Bars {
public Stream<Bar> getBars();
public Bars addBars(Bars bars);
}

class SingleBar implements Bars {
private final Bar bar;

public SingleBar(Bar bar) {
this.bar = bar;
}

public Stream<Bar> getBars() {
return Stream.of(bar);
}

public Bars addBars(Bars bars) {
return new MultiBar().addBars(this);
}
}

class MultiBar implements Bars {
private final List<Bar> barList = new ArrayList<>();

public Stream<Bar> getBars() {
return barList.stream();
}

public Bars addBars(Bars bars) {
bars.getBars().forEach(barList::add);
return this;
}
}

Map<Foo, Bars> map = new HashMap<>();
map.merge(foo, new SingleBar(bar), Bars::addBars);
map.get(foo).getBars().forEach(...);

说实话,避免列表似乎需要做很多工作,而且可能效率并不高。我会选择选项 1 或 2。

关于Java映射,少数按键冲突,解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40645752/

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