我正在寻找一个通用的懒惰不可修改列表实现的一个不错的实现来包装我的搜索结果条目.任务的不可修改部分很容易,因为它可以实现,Collections.unmodifiableList()所以我只需要理清懒惰的部分.
令人惊讶的是,谷歌收藏品没有提供任何东西; 而来自Apache Commons Collections的LazyList不支持泛型.
我发现尝试在google-collections之上构建一些东西,但它似乎是不完整的(例如不支持size()),过时的(不能用1.0最终编译)并且需要一些外部类,但可以用作一个好的开始指出建立自己的班级.
是否有人知道LazyList的任何良好实现?如果没有,您认为哪个选项更好:
java.util.AbstractList;欢迎任何其他建议.
编辑:解释为什么我需要一个懒惰的列表.
我有一个Lucene搜索结果(TopDocs),它基本上是Lucene文档的一堆指针.我的搜索结果类将这些指针作为输入并返回由提取的和以其他方式处理的Lucene文档组成的对象列表.通过将所有内容包装到一个惰性列表中,我希望确保在不必要时不进行昂贵的处理.
什么是一个简单快速的方法来获得一个从一开始就返回最多N个元素的迭代器List?
我能想出的最简单的版本是:
#1:
import com.google.common.collect.Iterators;
// ...
public static <E> Iterator<E> lengthLimitedIterator(Iterable<E> source, int maxLen) {
return Iterators.partition(source.iterator(), maxLen).next().iterator();
}
Run Code Online (Sandbox Code Playgroud)
#2:
public static <E> Iterator<E> lengthLimitedIterator(List<E> source, int maxLen) {
return source.subList(0, Math.min(source.size(), maxLen)).iterator();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,两个版本都创建了一个临时性List,这会显着影响性能,因为我在紧密循环中调用了这个方法数百万次
我可以使用其他任何库函数吗?
注意:我无法避免遍历列表,因为我将它传递给一个以迭代器作为参数的方法,我无法修改该类.
我有一个使用a的类,HashSet我想要类实现Iterable,但是,我不希望类迭代器支持该remove()方法.
默认迭代器HashSet是HashSet.KeyIterator类中的私有类 HashSet,所以我不能简单地扩展它并覆盖remove方法.
理想情况下,我想避免编写包装类KeyIterator,但我不知道如何轻松地以任何其他方式简单地实现我自己的迭代器.
有任何想法吗?
干杯,
皮特
coll.contains(null)前面的问题:为什么在 Java 中对 ImmutableCollections 的调用会失败?
我知道,不可变集合不能包含空元素,我不想讨论这是好是坏。
但是,当我编写一个需要一个(一般的,非显式不可变的)集合的函数时,它在检查空值时失败。为什么实现不返回 false(这实际上是“正确”答案)?
Collection一般来说,我如何正确检查 a 中的空值?
编辑:
经过一些讨论(感谢评论者!)我意识到,我混淆了两件事:番石榴库中的ImmutableCollection和java.util.List.of返回的 List ,是 ImmutableCollections 中的某个类。然而,这两个类都会在 上抛出 NPE .contains(null)。
我的问题在于List.of结果,但从技术上讲,番石榴实施也会发生同样的情况。[编辑:事实并非如此]
说我有一个java.util.List list,我想创建一个新List加入的元素e,以年初list(即,我想缺点 e和list).例如,如果list是
[1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
而e在5,再cons(e,list)会
[5,1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
它的元素list和cons(e,list)共享是可以的,但list不应该被修改.
实施最简单和/或最有效的方法是cons什么?结果不可修改是可以的.允许使用Google Collections Library.
如果list是com.google.common.collect.ImmutableList?
我正在使用Eclipse,并且我已经添加了google-collect.1.0-rc2.jar作为引用的库.但不知怎的,这仍然无效:
import com.google.common.collect.HashBiMap;
public class Odp {
//...
HashBiMap<Character, Integer> charOcc =
HashBiMap<Character, Integer>.create();
}
Run Code Online (Sandbox Code Playgroud)
Eclipse给出以下错误:
此行有多个标记
- HashBiMap无法解析
- Character.Integer无法解析
- 令牌",","."上的语法错误.预期
- 令牌"."上的语法错误,删除此令牌
- 对于类Odp,方法create()未定义
我究竟做错了什么?
其他谷歌的东西,如乔纳,工作得很好.(但乔伊纳不是通用的.)
我有一个方法需要一个Comparator参数.我想传递一个Comparator其中做了正常比较和一个反向,其确实在反向比较器.
java.util.Collections提供一个reverseOrder()这对反向比较有好处,但我找不到任何正常的Comparator.
我想到的唯一解决方案是Collections.reverseOrder(Collections.reverseOrder()).但我不喜欢它因为调用里面的双重方法.
当然我可以这样写NormalComparator:
public class NormalComparator<T extends Comparable> implements Comparator<T> {
public int compare(T o1, T o2) {
return o1.compareTo(o2);
}
}
Run Code Online (Sandbox Code Playgroud)
但我真的很惊讶Java没有开箱即用的解决方案.
有人在Google Collections中使用过TreeMultimap吗?据我所知,使用TreeMultimap,其键和值按其自然顺序或提供的比较器排序.我想知道是否有一个函数允许用户提供一个键并返回其键大于用户提供的键的所有值.这可以使用Java中的SortedMap来完成,它具有一个名为tailMap的函数.谢谢!
我在Java中有两个数据结构:
一个叫做DebateAssignment,有5个DebateTeam对象,每个对象都包含一个包含的特定枚举
{JUDGE, PROP1, PROP2, OP1, OP2}
Run Code Online (Sandbox Code Playgroud)
在另一类我使用List<DebateAssignment>,我想创建一个迭代器,它指向一个特定的DebateTeam特定DebateAssignment,我希望它所有的球队在所有任务迭代,从分配要分配的无缝连接.
我该怎么做呢?
我正在使用Google Collections库AbstractIterator来实现生成器.我这样做时遇到了一个问题; 我把它缩小为更基本的类型并重现了这个问题.这种减少对于它的作用显然有点过分,通过Iterable从1计算到数字.
基本上在下面的代码中,未注释的版本起作用,而注释的版本不起作用(最后提供一个null元素,而不是以最后一个数字结尾).
我做错了什么,或者这是图书馆的问题?
private Iterable<Integer> elementGenerator(final int numelements) {
return new Iterable<Integer>() {
@Override public Iterator<Integer> iterator() {
return new AbstractIterator<Integer>(){
int localcount=0;
@Override protected Integer computeNext() {
if (localcount++ == numelements) return endOfData();
return localcount;
// return (localcount++ == numelements) ? endOfData() : localcount;
}
};
}
};
}
Run Code Online (Sandbox Code Playgroud)
我也尝试摆弄这个?:安排(例如,在返回前加上前缀并比较+1),但无济于事.我捅了一下寻找关于这个的文档,但没有找到任何东西.显然,?:语法只是方便,不是必需品,但仍然......
java ×10
collections ×7
guava ×7
iterator ×4
list ×2
bimap ×1
comparable ×1
comparator ×1
immutability ×1
iterable ×1