这种通用库方法的最佳实现是什么?
public static <K, V> boolean containsEntry(
Map<K, V> map, K key, V value) {}
Run Code Online (Sandbox Code Playgroud)
与大多数编码难题一样,判断此谜题的标准依次为:
编辑:
好吧,既然关闭了,我不妨发布答案.我认为这可能是最佳的:
V valueForKey = map.get(key);
return (valueForKey == null)
? value == null && map.containsKey(key)
: valueForKey.equals(value);
Run Code Online (Sandbox Code Playgroud)
一个聪明的简单解决方案是:
return map.entrySet().contains(
new AbstractMap.SimpleImmutableEntry<K, V>(key, value));
Run Code Online (Sandbox Code Playgroud)
它确实分配了一个实例,但它为地图实现提供了更多机会来做一些最佳的事情.
我需要使用一定比例的可用RAM来缓存Java中的对象.我知道其他人已经提出了这个问题,但没有一个回复符合我的要求.
我的要求是:
我尝试使用LinkedHashMap,但是它要求你指定最大数量的元素,我不知道填充可用RAM需要多少元素(它们的大小会有很大差异).
我目前的方法是使用Google Collection的MapMaker,如下所示:
Map<String, Object> cache = new MapMaker().softKeys().makeMap();
Run Code Online (Sandbox Code Playgroud)
这看起来很有吸引力,因为它应该在需要更多RAM时自动删除元素,但是存在一个严重的问题:它的行为是填满所有可用的RAM,此时GC开始抖动,整个应用程序的性能急剧恶化.
我听说过像EHCache这样的东西,但它对于我需要的东西似乎相当重,而且我不确定它是否足够快我的应用程序(记住解决方案不能比HashMap慢得多) .
我有List<Foo> getFoos ()从远程服务器获取数据并返回它的方法.
当然,用户不应该更改列表中的项目数量,因为他将获得与服务器上的数据不同步的数据(并且如果他想要更改他具有特殊方法的项目数量addFoo ()).
第一种方法是返回数组和更改方法的签名Foo[] getFoos ().但它在java中更常见,用户使用集合操作更方便,所以我将签名更改为List<Foo> getFoos ().此方法始终返回
Collections.unmodifiableList (originalList)
因此,当用户尝试更改列表时,他将获得RuntimeException.
在类似案例中是否有关于api设计的建议?
演讲中有一篇说"这些方法很懒散!"
Iterable transform(Iterable, Function)*
Iterable filter(Iterable, Predicate)*
T find(Iterable<T>, Predicate)
Iterable concat(Iterable<Iterable>)
Iterable cycle(Iterable)
T getOnlyElement(Iterable<T>)
Iterable<T> reverse(List<T>)
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我理解他们的意思,让我说我有一个集合,Persons我应用过滤器只返回姓氏为DOE的人.
那么这是否意味着"过滤仅在第一次调用doeOnly.next()时发生?"
List<Person> persons= ....
Iterable doeOnly= Iterables.filter(persons,DOE_AS_LAST_NAME_PREDICATE);
Run Code Online (Sandbox Code Playgroud) 我想知道一些实际的用例(如果它们与任何编程语言没有关联/关系会更好).我可以将集合,列表和映射与实际用例相关联.
例如,如果您想要一本书的词汇表,其中您想要的术语按字母顺序列出,并且位置/页码是值,您将使用集合TreeMap(OrderedMap这是一个Map)
不知何故,我无法将MultiSets与任何"实用"用例相关联.有人知道有什么用途吗?
http://en.wikipedia.org/wiki/Multiset并没有告诉我足够的:)
PS:如果你们认为这应该是社区维基,那就没关系.我没有这么做的唯一原因是"有一个明确的客观方式来回答这个问题".
我有一个Map接口的自定义实现,它做了一些奇特的东西,比如懒惰的函数评估.从外部构造后,实现应该是不可变的(例如,不支持put()和putAll()方法)
我看起来它在最基本的条件下工作.由于它非常复杂,我相信必须有大量潜在的错误,线程安全,不规则的操作顺序等等.
由于Map接口的合约定义明确,我确信必须存在一个通用的测试集合,用于检查角落情况,线程安全等.
我听说Google Collections为他们的库运行了大约25000个单元测试.可以在某处下载它们吗?
我最喜欢的一个来自apache commons-collections的是LazyMap,它可以在运行时使用Transformer实例化实例化值map.get(newKey); // Will not return null!.
为什么谷歌收藏品不一样?
是否有相当于MultiMaps的漂亮MapMaker?目前我创建这样的缓存:
public static Map<Session,List<Person>> personCache = new MapMaker().weakKeys().makeMap();
Run Code Online (Sandbox Code Playgroud)
MultiMap的重点是避免嵌套的List值.有没有办法用弱键构造多图?
java ×9
guava ×8
collections ×6
api-design ×1
caching ×1
gwt ×1
iterator ×1
multimap ×1
oop ×1
puzzle ×1
unit-testing ×1