Java:一个排序的多图,它是列表的映射而不是集合的映射
Java: a sorted multimap which is a map of lists and not a map of sets
我正在寻找一个排序的多重映射,其中单个键可以映射到多个值,无论这些值的 equals()
返回什么。因此,它不应该是这样的:
import com.google.common.collect.*;
public class Test {
public static void main(String[] args) {
Multimap<Double, String> multimap = TreeMultimap.create();
multimap.put(3.0, "a");
multimap.put(3.0, "a");
multimap.put(2.0, "b");
// prints "b", "a"
for(String s : multimap.values())
System.out.println(s);
}
}
我一直在使用 java.util.Map<Key, List<Value>>
但它带有一些样板文件。
其中一种可能性是参数化类型:
public class SortedMapOfLists<K, V> {
SortedMap<K, List<V>> map = new TreeMap<>();
public void put(K key, V value) {
List<V> list = map.get(key);
if(list == null) {
list = new ArrayList<>();
map.put(key, list);
}
list.add(value);
}
public List<V> values() {
List<V> values = new ArrayList<>();
for(List<V> list : map.values())
for(V value : list)
values.add(value);
return values;
}
}
但此实现的功能有限。
听起来您正在寻找 MultimapBuilder.treeKeys().arrayListValues().build()
。
我想知道为什么抢到第三方图书馆是这里的第一站。在我看来,您可以使用标准集合框架实现所需的功能,而无需像您建议的那样多的样板。例如,给定一个普通的旧 TreeMap:
SortedMap<String, List<String>> map = new TreeMap<>();
你的put方法可以换成一行:
map.computeIfAbsent(key, k -> new ArrayList<>()).add(val);
类似地,如果您想获取与给定键关联的值和 return 列表的浅表副本(如果没有关联的值则为空——您的方法实际上并未涵盖但也许你想要),你可以这样做:
List<String> vals = new ArrayList<>(map.getOrDefault(key, Collections.emptyList()));
从您提到的具体用例来看,第三方库似乎是一种不必要的依赖,几乎没有什么好处。
我正在寻找一个排序的多重映射,其中单个键可以映射到多个值,无论这些值的 equals()
返回什么。因此,它不应该是这样的:
import com.google.common.collect.*;
public class Test {
public static void main(String[] args) {
Multimap<Double, String> multimap = TreeMultimap.create();
multimap.put(3.0, "a");
multimap.put(3.0, "a");
multimap.put(2.0, "b");
// prints "b", "a"
for(String s : multimap.values())
System.out.println(s);
}
}
我一直在使用 java.util.Map<Key, List<Value>>
但它带有一些样板文件。
其中一种可能性是参数化类型:
public class SortedMapOfLists<K, V> {
SortedMap<K, List<V>> map = new TreeMap<>();
public void put(K key, V value) {
List<V> list = map.get(key);
if(list == null) {
list = new ArrayList<>();
map.put(key, list);
}
list.add(value);
}
public List<V> values() {
List<V> values = new ArrayList<>();
for(List<V> list : map.values())
for(V value : list)
values.add(value);
return values;
}
}
但此实现的功能有限。
听起来您正在寻找 MultimapBuilder.treeKeys().arrayListValues().build()
。
我想知道为什么抢到第三方图书馆是这里的第一站。在我看来,您可以使用标准集合框架实现所需的功能,而无需像您建议的那样多的样板。例如,给定一个普通的旧 TreeMap:
SortedMap<String, List<String>> map = new TreeMap<>();
你的put方法可以换成一行:
map.computeIfAbsent(key, k -> new ArrayList<>()).add(val);
类似地,如果您想获取与给定键关联的值和 return 列表的浅表副本(如果没有关联的值则为空——您的方法实际上并未涵盖但也许你想要),你可以这样做:
List<String> vals = new ArrayList<>(map.getOrDefault(key, Collections.emptyList()));
从您提到的具体用例来看,第三方库似乎是一种不必要的依赖,几乎没有什么好处。