jav*_*vaj 29 java collections list
我有一个列表/对象集合,可能有也可能没有相同的属性值.获得具有相同属性的对象的明确列表的最简单方法是什么?一种集合类型最适合此目的吗?例如,在C#中,我可以使用LINQ执行以下操作.
var recipients = (from recipient in recipientList
select recipient).Distinct();
Run Code Online (Sandbox Code Playgroud)
我最初的想法是使用lambdaj(链接文本),但它似乎不支持这一点.
Cha*_*ert 39
return new ArrayList(new HashSet(recipients));
Run Code Online (Sandbox Code Playgroud)
glm*_*ndr 28
使用接口的实现Set<T>(类T可能需要自定义.equals()方法,您可能必须.equals()自己实现).通常情况下HashSet,它是开箱即用的:它使用Object.hashCode()和Object.equals()方法来比较对象.对于简单的对象来说,这应该是唯一的.如果没有,你必须实施T.equals()并T.hashCode()相应地.
有关帮助实现equals和hashcode的库,请参阅下面的Gaurav Saini的评论.
Rob*_*anu 20
将它们放在一个TreeSet中,该TreeSet包含一个自定义Comparator,它会检查您需要的属性:
SortedSet<MyObject> set = new TreeSet<MyObject>(new Comparator<MyObject>(){
public int compare(MyObject o1, MyObject o2) {
// return 0 if objects are equal in terms of your properties
}
});
set.addAll(myList); // eliminate duplicates
Run Code Online (Sandbox Code Playgroud)
Dex*_*spi 11
Java 8:
recipients = recipients.stream()
.distinct()
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
见java.util.stream.Stream#distinct.
命令保留上述响应的版本
return new ArrayList(new LinkedHashSet(recipients));
Run Code Online (Sandbox Code Playgroud)
如果您正在使用Eclipse Collections,则可以使用该方法distinct().
ListIterable<Integer> integers = Lists.mutable.with(1, 3, 1, 2, 2, 1);
Assert.assertEquals(
Lists.mutable.with(1, 3, 2),
integers.distinct());
Run Code Online (Sandbox Code Playgroud)
使用distinct()而不是转换为Set然后返回List 的优点是distinct()保留原始List的顺序,保留每个元素的第一次出现.它是通过使用Set和List实现的.
MutableSet<T> seenSoFar = Sets.mutable.with();
int size = list.size();
for (int i = 0; i < size; i++)
{
T item = list.get(i);
if (seenSoFar.add(item))
{
targetCollection.add(item);
}
}
return targetCollection;
Run Code Online (Sandbox Code Playgroud)
如果无法将原始List转换为Eclipse Collections类型,则可以使用ListAdapter获取相同的API.
MutableList<Integer> distinct = ListAdapter.adapt(integers).distinct();
Run Code Online (Sandbox Code Playgroud)
注意:我是Eclipse Collections的提交者.
| 归档时间: |
|
| 查看次数: |
78522 次 |
| 最近记录: |