一般基本的 Map 是唯一的 Key,搭配一個 Value 的資料結構,實務上,有時候會遇到,一個 Key,搭配對應的 Value,在 Value 是有多種可能的,例如在公司部門分類下,每個部門都有各自的員工。
這種資料結構,用標準 JDK 提供的 Map 搭配 ArrayList 就可以完成,但還有其他幾個封裝比較好的函式庫,有提供這種資料結構的類別實作。
Apache Commons Collecitons 的 MultiValuedMap
Guava 的 Multimap
Spring Framework 的 MultiValueMap
如果要測試這幾種實作方式,要先引用函式庫
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.5.0-jre</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>7.0.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.5.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
Java 實例
import com.google.common.collect.Multimap;
import org.apache.commons.collections4.MultiValuedMap;
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.util.*;
public class ArrayListMultimap {
public void main(String[] args) {
ArrayListMultimap.jdk();
ArrayListMultimap.apacheCommons();
ArrayListMultimap.guava();
ArrayListMultimap.spring();
}
public static void addEmployee(Map<String, List<String>> map, String department, String employee) {
if (!map.containsKey(department)) {
map.put(department, new ArrayList<>());
}
map.get(department).add(employee);
}
public static void jdk() {
Map<String, List<String>> departmentEmployees = new HashMap<>();
addEmployee(departmentEmployees, "RD", "Thomas");
addEmployee(departmentEmployees, "RD", "James");
addEmployee(departmentEmployees, "MA", "Emma");
addEmployee(departmentEmployees, "MA", "Dave");
addEmployee(departmentEmployees, "HR", "Carol");
System.out.println("=== JDK HashMap + List<String> ===");
System.out.println(departmentEmployees);
}
public static void apacheCommons() {
MultiValuedMap<String, String> departmentEmployees = new ArrayListValuedHashMap<>();
departmentEmployees.put("RD", "Thomas");
departmentEmployees.put("RD", "James");
departmentEmployees.put("MA", "Emma");
departmentEmployees.put("MA", "Dave");
departmentEmployees.put("HR", "Carol");
System.out.println("=== Apache Commons ArrayListValuedHashMap ===");
System.out.println(departmentEmployees);
}
public static void guava() {
List<String> rdlist = Arrays.asList("Thomas", "James");
List<String> malist = Arrays.asList("Emma", "Dave");
List<String> hrlist = Arrays.asList("Carol");
Multimap<String, List<String>> listMultimap = com.google.common.collect.ArrayListMultimap.create();
listMultimap.put("RD", rdlist);
listMultimap.put("MA", malist);
listMultimap.put("HR", hrlist);
System.out.println("=== guava ArrayListMultimap ===");
System.out.println(listMultimap);
}
public static void spring() {
MultiValueMap<String, String> departmentEmployees = new LinkedMultiValueMap<>();
departmentEmployees.add("RD", "Thomas");
departmentEmployees.add("RD", "James");
departmentEmployees.add("MA", "Emma");
departmentEmployees.add("MA", "Dave");
departmentEmployees.add("HR", "Carol");
System.out.println("=== Spring LinkedMultiValueMap ===");
System.out.println(departmentEmployees);
}
}
執行結果
=== JDK HashMap + List<String> ===
{RD=[Thomas, James], MA=[Emma, Dave], HR=[Carol]}
=== Apache Commons ArrayListValuedHashMap ===
{RD=[Thomas, James], MA=[Emma, Dave], HR=[Carol]}
=== guava ArrayListMultimap ===
{RD=[[Thomas, James]], MA=[[Emma, Dave]], HR=[[Carol]]}
=== Spring LinkedMultiValueMap ===
{RD=[Thomas, James], MA=[Emma, Dave], HR=[Carol]}
沒有留言:
張貼留言