gpt4 book ai didi

java - 重构 Java Map of Map of Map

转载 作者:搜寻专家 更新时间:2023-10-31 08:09:46 31 4
gpt4 key购买 nike

我正在审查一个项目的旧代码,并使用 MapMapMap 获得了如下数据结构(3 层 map ):

// data structure
Map<String, Map<String, Map<String, List<String>>>> tagTree
= new HashMap<String, Map<String,Map<String,List<String>>>>();

并从 Map 中获取值(我认为这是最好的部分)

// fetch at tag values
List<String> tagList1 = tagTree.get("Java").get("Active").get("Tags");
List<String> tagList2 = tagTree.get("Java").get("Latest").get("SubTags");

将值放在 Map 中(有点复杂且容易出错)

// put values
Map<String, Map<String, List<String>>> javaLangMap = new HashMap<String, Map<String, List<String>>>();
Map<String, List<String>> javaStatusMap = new HashMap<String, List<String>>();
List<String> javaTagList = new ArrayList<String>();

javaTagList.add("Java-OOP");
javaTagList.add("Java-Variables");
// put tag list
javaStatusMap.put("Tags", javaTagList);
// put status-wise tag
javaLangMap.put("Active", javaStatusMap);
// put language-wise tag
tagTree.put("Java", javaLangMap);

目前这用于维护以下结构

TagLanguage -> TagStatus -> TagType -> TagList

我打算重构这个 map ,因为其他开发人员很难阅读它。

请考虑以下情况,分享您的想法:

  • 所有四层都可以在运行时更改。
  • 所有级别都应该无障碍
  • 需要内存解决方案,即不使用数据库表层次结构。

最佳答案

如果您只想访问数据结构的最后一层,您可以使用 Multimap<Triple<String,String,String>,String> . Multimap<K,V> 是来自 Guava 的数据结构,它基本上是一个更好的 Map<K,Collection<V>> . Triple<L,M,R> 是来自 Apache Commons Lang3 的 3 元素元组数据结构,即 Comparable并实现 equals .

你可以这样声明你的标签树:

Multimap<Triple<String, String, String>, String> tagTree = HashMultimap.create();

然后像这样填写:

tagTree.put(Triple.of("Java", "Active", "Tags"), "Java-OOP");
tagTree.put(Triple.of("Java", "Active", "Tags"), "Java-Variables");

或者:

tagTree.putAll(Triple.of("Java", "Active", "Tags"), Arrays.asList("Java-OOP", "Java-Variables"));

然后像这样从中获取你的值:

Set<String> values = tagTree.get(Triple.of("Java", "Active", "Tags"));

这是另一个可能适合您的粗略解决方案,它可以使用 1、2 或 3 个键:

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.tuple.Triple;

import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;

public class ThreeLevelMap<K1, K2, K3, V> {
private Map<K1, Map<K2, Multimap<K3, V>>> firstLevelMap = new HashMap<>();
private Map<Pair<K1, K2>, Multimap<K3, V>> secondLevelMap = new HashMap<>();
private Multimap<Triple<K1, K2, K3>, V> thirdLevelMap = HashMultimap.create();

public void put(K1 key1, K2 key2, K3 key3, V value) {
thirdLevelMap.put(Triple.of(key1, key2, key3), value);

final Pair<K1, K2> secondLevelKey = Pair.of(key1, key2);
Multimap<K3, V> secondLevelContainer = secondLevelMap.get(secondLevelKey);
if (secondLevelContainer == null) {
secondLevelContainer = HashMultimap.create();
secondLevelMap.put(secondLevelKey, secondLevelContainer);
}
secondLevelContainer.put(key3, value);

Map<K2, Multimap<K3, V>> firstLevelContainer = firstLevelMap.get(key1);
if (firstLevelContainer == null) {
firstLevelContainer = new HashMap<>();
firstLevelMap.put(key1, firstLevelContainer);
}
firstLevelContainer.put(key2, secondLevelContainer);
}

public Collection<V> get(K1 key1, K2 key2, K3 key3) {
return thirdLevelMap.get(Triple.of(key1, key2, key3));
}

public Multimap<K3, V> get(K1 key1, K2 key2) {
return secondLevelMap.get(Pair.of(key1, key2));
}

public Map<K2, Multimap<K3, V>> get(K1 key1) {
return firstLevelMap.get(key1);
}
}

你可以这样使用它:

ThreeLevelMap<String, String, String, String> tlm = new ThreeLevelMap<>();
tlm.put("Java", "Active", "Tags", "Java-OOP");
tlm.put("Java", "Active", "Tags", "Java-Variables");

Map<String, Multimap<String, String>> firstLevelMap = tlm.get("Java");
Multimap<String, String> secondLevelMap = tlm.get("Java", "Active");
Collection<String> tags = tlm.get("Java", "Active", "Tags");

我说它很粗糙是因为:

  • get 的 map 方法返回是可修改的
  • 我没有实现 remove方法
  • 我没怎么测试

关于java - 重构 Java Map of Map of Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36244782/

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