我使用MultiMap的Guava库.我创建了一个示例MultiMap.当我打印地图的大小时,我得到4但实际值(我认为)应该是2.为什么这个差异?
import java.util.Collection;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
public class MultiMapTest {
public static void main(String... args) {
Multimap<String, String> myMultimap = ArrayListMultimap.create();
// Adding some key/value
myMultimap.put("Fruits", "Bannana");
myMultimap.put("Fruits", "Apple");
myMultimap.put("Fruits", "Pear");
myMultimap.put("Vegetables", "Carrot");
System.out.println(myMultimap);
// Getting the size
int size = myMultimap.size();
System.out.println(size); // 4
// Getting values
Collection<String> fruits = myMultimap.get("Fruits");
System.out.println(fruits); // [Bannana, Apple, Pear]
Collection<String> vegetables = myMultimap.get("Vegetables");
System.out.println(vegetables); // [Carrot]
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Fruits=[Bannana, Apple, Pear], Vegetables=[Carrot]}
4
[Bannana, …Run Code Online (Sandbox Code Playgroud) 我有2个迭代器,需要返回一个包含第一个对象的迭代器减去第二个包含的对象.使用Apache.commons或Guava有什么好办法吗?
我正在使用JDK 7,SQLite,并在我的项目中使用了Guava.
我有一个少于100个条目的TreeMap,由一个"工作"线程每秒更新数百次.我现在正在编写一个组件(另一个线程 - "DB线程"),它将每隔5或10秒将映射写入我的数据库.
我知道我需要制作地图的深层副本,以便数据库线程将使用快照,而工作线程继续其工作.我正在查看Guava Maps类,它有许多制作副本的方法,但我不确定它们是否满足我在需要副本时在地图上同步的需要.有没有一种方法可以满足我的需求,或者我应该编写一个同步块来制作我自己的深层副本?
举两个多重集,例如,第一个:
Green
Green
Blue
Yellow
Yellow
Yellow
Cyan
Cyan
Run Code Online (Sandbox Code Playgroud)
第二个:
Green
Yellow
Yellow
Magenta
Black
Black
Run Code Online (Sandbox Code Playgroud)
我需要得到他们的交集,以便结果看起来像:
Green
Green
Green
Yellow
Yellow
Yellow
Yellow
Yellow
Run Code Online (Sandbox Code Playgroud)
在Java中实现这一目标的有效方法是什么?(任何链接到库或函数将不胜感激.)
我需要为单元测试做这个.正在测试的方法返回一个ImmutbaleMap,我需要能够将它与我已经拥有的那个进行比较.一种方法是为两个(keySets())获取密钥集,运行它们并比较这两个映射返回的值.然而,对我来说这似乎有点低效.有没有更好/首选的方法来做到这一点?
我出于好奇而下载了Google Guava的源代码,以了解支持不可变集合的内容.
我正在浏览ImmutableList,我注意到它仍然由一个老式数组支持,如同 Object[]
所以我只是好奇,这个Object[]数组本质上可能是可变的,并且它不是线程安全的.我已经知道ArrayList和CopyOnWriteArrayList是由Object[]数组支持的,但它们是可变的.
因此,ImmutableList只是不可变和线程安全的,因为它的内部属性被很好地封装和保护了吗?它是不可变的还是线程安全的,因为封装确保在构造之后什么都不会修改它?是否有一天像这样的低级别数组将被更换为更好的而不是遗留的东西,并且本质上是不可变的和最终的而不是通过仔细的封装不可变?
我知道谓词的基础知识,并理解下面从这个问题复制的代码
Predicate<Integer> isEven = new Predicate<Integer>() {
@Override public boolean apply(Integer number) {
return (number % 2) == 0;
}
};
Iterable<Integer> evenNumbers = Iterables.filter(numbers, isEven);
Run Code Online (Sandbox Code Playgroud)
但是有可能为与谓词不匹配的项获得可迭代(不更改谓词代码)吗?
我一直在谷歌上搜索,我找到了答案.番石榴中有一个Iterables.concat.但这会返回一个Iterable,接下来我要做的就是对结果进行排序. Collections.sort发生在一个List,而不是一个Iterable,所以我不得不转换Iterable成List作为我的下一个步骤.是否有更直接的方法来组合两个Lists然后对结果进行排序?
这适用于Java 1.7,但不适用于1.6.(这是使用Guava 14.0.1).
Cache<TokenCacheKey, CachedToken>tokenCache = CacheBuilder.<TokenCacheKey, CachedToken>from(PARAM.tokenCacheConfig).build();
Run Code Online (Sandbox Code Playgroud)
任何人都可以提出可以在1.6中编译的替代方案吗?
我目前正在使用以下CharMatcher算法在一个1000万条推文的文件中解析twitter状态中的所有@Mentions.它似乎占用了大量的记忆.运行Netbeans分析器,它似乎创建了很多char []数组,我只能假设它来自我实现的CharMatcher解决方案.
任何人都可以推荐一个更有效的CharMatcher/Strings方法或一个正则表达式解决方案(我认为在对象创建方面会更有效)?速度不是我主要关心的问题....
@Override
public boolean filter(Tweet msg) {
List<String> statusList = Splitter.on(CharMatcher.BREAKING_WHITESPACE).trimResults().omitEmptyStrings().splitToList(msg.getStatusText());
for (int i = 0; i < statusList.size(); i++) {
if (statusList.get(i).contains("@")) {
insertTwitterLegalUsernames(statusList.get(i), msg);
}
}
if (msg.hasAtMentions()) {
Statistics.increaseNumTweetsWithAtMentions();
}
statusList = null;
return msg.hasAtMentions();
}
private void insertTwitterLegalUsernames(String token, Tweet msg) {
token = token.substring(token.indexOf("@"), token.length());
List<String> splitList = Splitter.on(CharMatcher.inRange('0', '9').or(CharMatcher.inRange('a', 'z')).or(CharMatcher.inRange('A', 'Z')).or(CharMatcher.anyOf("_@")).negate()).splitToList(token);
for (int j = 0; j < splitList.size(); j++) {
if (splitList.get(j).length() > 1 && splitList.get(j).contains("@")) {
String finalToken = splitList.get(j).substring(splitList.get(j).lastIndexOf("@") …Run Code Online (Sandbox Code Playgroud)