Java - 不同的对象列表

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)

  • 您实际上回答了问题(而不是仅仅列出回答问题的工具)。 (2认同)

glm*_*ndr 28

使用接口的实现Set<T>(类T可能需要自定义.equals()方法,您可能必须.equals()自己实现).通常情况下HashSet,它是开箱即用的:它使用Object.hashCode()Object.equals()方法来比较对象.对于简单的对象来说,这应该是唯一的.如果没有,你必须实施T.equals()T.hashCode()相应地.

有关帮助实现equals和hashcode的库,请参阅下面的Gaurav Saini的评论.

  • 如果存在哈希冲突,HashSet 也会使用 equals。 (2认同)
  • 或者,使用Apache的Commons提供的HashCodeBuilder和EqualsBuilder,使用覆盖hashCode()和equals()方法的标准方法.HashCodeBuilder:http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/builder/HashCodeBuilder.html EqualsBuilder:http://commons.apache.org/lang//api-2.4/组织/阿帕奇/公/郎/建设者/ EqualsBuilder.html (2认同)

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)

  • 仅当比较器与equals()一致时才有效,此时你最好还是使用HashSet. (3认同)
  • 为什么它应该与equals()一致?这通常是这种情况,但目前我们需要根据自定义条件删除一些重复项.比较器是我能想到的最不引人注目的方式. (2认同)

Dex*_*spi 11

Java 8:

recipients = recipients.stream()
    .distinct()
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

java.util.stream.Stream#distinct.


rud*_*nev 9

命令保留上述响应的版本

return new ArrayList(new LinkedHashSet(recipients));
Run Code Online (Sandbox Code Playgroud)


Cra*_*lin 7

如果您正在使用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的提交者.