Java-如何从集合中删除具有相同属性值的元素?
假设有一个具有SomeField属性的SomeClass元素集合。如何从此集合中删除具有等效SomeField属性的重复元素并仅保留一个具有该SomeField值的元素?Java集合有一个可选的Java-如何从集合中删除具有相同属性值的元素?,java,algorithm,list,collections,Java,Algorithm,List,Collections,假设有一个具有SomeField属性的SomeClass元素集合。如何从此集合中删除具有等效SomeField属性的重复元素并仅保留一个具有该SomeField值的元素?Java集合有一个可选的删除方法。假设您正在处理的集合支持它,您可以使用它: 布尔删除(对象o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作) 假设集合有一个add方法,则可以在元素存在时(使用contains检查)运行一个循环,从集合中删除该元素,但一旦该元素没有add方法,就可以执行该循环 while(myCol
删除方法。假设您正在处理的集合支持它,您可以使用它:
布尔删除(对象o)
从该集合中删除指定元素的单个实例(如果存在)(可选操作)
假设集合有一个add
方法,则可以在元素存在时(使用contains
检查)运行一个循环,从集合中删除该元素,但一旦该元素没有add
方法,就可以执行该循环
while(myCollection.contains(el)){
myCollection.remove(el);
}
myCollection.add(el);
然后再重复一遍-可能最好从集合中创建一个集合
(例如,通过将其传递给树集
构造函数)-集合保证每个元素只有一个实例
Set unique = new TreeSet(myCollection); // assumes comparable
Set unique2 = new HashSet(myCollection); // assumes hashCode
Java集合有一个可选的remove
方法。假设您正在处理的集合支持它,您可以使用它:
布尔删除(对象o)
从该集合中删除指定元素的单个实例(如果存在)(可选操作)
假设集合有一个add
方法,则可以在元素存在时(使用contains
检查)运行一个循环,从集合中删除该元素,但一旦该元素没有add
方法,就可以执行该循环
while(myCollection.contains(el)){
myCollection.remove(el);
}
myCollection.add(el);
然后再重复一遍-可能最好从集合中创建一个集合
(例如,通过将其传递给树集
构造函数)-集合保证每个元素只有一个实例
Set unique = new TreeSet(myCollection); // assumes comparable
Set unique2 = new HashSet(myCollection); // assumes hashCode
使用地图
将所有内容转储到由SomeField
键入的Map
(假设SomeField
定义良好的等于和hashCode
),然后获取Map.value
如果要保留上次遇到的重复项,请执行以下操作:
final Collection<SomeClass> filtered = list.stream()
.collect(Collectors.toMap(SomeClass::getKey, identity()))
.values();
final HashMap<Integer, SomeClass> mapped = list.stream()
.collect(HashMap::new, (m, s) -> m.merge(s.getKey(), s, (l, r) -> l), HashMap::putAll);
final Collection<SomeClass> filtered = mapped.values();
final Collection filtered=list.stream()
.collect(Collectors.toMap(SomeClass::getKey,identity())
.values();
或者,如果要先对重复的进行计数,请执行以下操作:
final Collection<SomeClass> filtered = list.stream()
.collect(Collectors.toMap(SomeClass::getKey, identity()))
.values();
final HashMap<Integer, SomeClass> mapped = list.stream()
.collect(HashMap::new, (m, s) -> m.merge(s.getKey(), s, (l, r) -> l), HashMap::putAll);
final Collection<SomeClass> filtered = mapped.values();
final HashMap mapped=list.stream()
.collect(HashMap::new,(m,s)->m.merge(s.getKey(),s,(l,r)->l),HashMap::putAll);
最终集合筛选=mapped.values();
在第二种情况下,类型推断系统需要一些帮助,因此您需要分配中间映射
使用映射
将所有内容转储到由SomeField
键入的Map
(假设SomeField
定义良好的等于和hashCode
),然后获取Map.value
如果要保留上次遇到的重复项,请执行以下操作:
final Collection<SomeClass> filtered = list.stream()
.collect(Collectors.toMap(SomeClass::getKey, identity()))
.values();
final HashMap<Integer, SomeClass> mapped = list.stream()
.collect(HashMap::new, (m, s) -> m.merge(s.getKey(), s, (l, r) -> l), HashMap::putAll);
final Collection<SomeClass> filtered = mapped.values();
final Collection filtered=list.stream()
.collect(Collectors.toMap(SomeClass::getKey,identity())
.values();
或者,如果要先对重复的进行计数,请执行以下操作:
final Collection<SomeClass> filtered = list.stream()
.collect(Collectors.toMap(SomeClass::getKey, identity()))
.values();
final HashMap<Integer, SomeClass> mapped = list.stream()
.collect(HashMap::new, (m, s) -> m.merge(s.getKey(), s, (l, r) -> l), HashMap::putAll);
final Collection<SomeClass> filtered = mapped.values();
final HashMap mapped=list.stream()
.collect(HashMap::new,(m,s)->m.merge(s.getKey(),s,(l,r)->l),HashMap::putAll);
最终集合筛选=mapped.values();
在第二种情况下,类型推断系统需要一些帮助,因此您需要分配中间映射集合
类没有直接的删除
方法。您可以实现Collection
接口和实现remove
方法,或者使用其他实现之一(LinkedList、Set、ArrayList等)
以下是伪代码,但您可以根据自己的需要对其进行调整:
Collection<YourType> list = new ArrayList<>();
// Add your objects to it - to make your collection
for (YourType T: ArrayOfYourType)
list.add(T);
// Remove elements from the list
for (YourType T: list)
if T.getSomeProps() == equals(your_val){ // Or equals()
list.remove(T);
}
Collection list=new ArrayList();
//将您的对象添加到其中-使您的收藏
对于(您的类型T:ArrayOfYourType)
列表。添加(T);
//从列表中删除元素
对于(您键入的T:列表)
如果T.getSomeProps()==equals(您的值){//或equals()
列表。删除(T);
}
您也可以使用映射对列出它们,但这对于您尝试执行的操作来说可能是一种过度的操作。Collections
类没有直接的remove
方法。您可以实现Collection
接口和实现remove
方法,或者使用其他实现之一(LinkedList、Set、ArrayList等)
以下是伪代码,但您可以根据自己的需要对其进行调整:
Collection<YourType> list = new ArrayList<>();
// Add your objects to it - to make your collection
for (YourType T: ArrayOfYourType)
list.add(T);
// Remove elements from the list
for (YourType T: list)
if T.getSomeProps() == equals(your_val){ // Or equals()
list.remove(T);
}
Collection list=new ArrayList();
//将您的对象添加到其中-使您的收藏
对于(您的类型T:ArrayOfYourType)
列表。添加(T);
//从列表中删除元素
对于(您键入的T:列表)
如果T.getSomeProps()==equals(您的值){//或equals()
列表。删除(T);
}
您也可以使用映射对列出它们,但这可能会对您尝试执行的操作造成过度伤害。您需要为SomeClass实现hashCode和equals,以便只考虑SomeField
class SomeClass {
private SomeField field;
public int hashCode() {
return field.hashCode();
}
public boolean equals(Object o) {
if (o instanceof SomeClass == false){
return false
}
SomeClass someClass = (SomeClass)o;
return someClass.field.equals(this.field)
}
}
现在,您可以将所有内容放入集合中,以便删除重复项
Set set = new HashSet(collection);
您需要为SomeClass实现hashCode和equals,以便只考虑SomeField
class SomeClass {
private SomeField field;
public int hashCode() {
return field.hashCode();
}
public boolean equals(Object o) {
if (o instanceof SomeClass == false){
return false
}
SomeClass someClass = (SomeClass)o;
return someClass.field.equals(this.field)
}
}
现在,您可以将所有内容放入集合中,以便删除重复项
Set set = new HashSet(collection);
有几种简单的方法可以解决这个问题
如果SomeField
值是SomeClass
的唯一成员,则可以基于SomeField
在SomeClass
中轻松重写hashCode
和等于,然后只需将原始集合添加到HashSet
如果情况并非如此,而且SomeClass
更复杂,您仍然可以使用集合
。但是,您需要以某种方式过滤掉重复项,一种好的方法是将比较器与