Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何从集合中删除具有相同属性值的元素?_Java_Algorithm_List_Collections - Fatal编程技术网

Java-如何从集合中删除具有相同属性值的元素?

Java-如何从集合中删除具有相同属性值的元素?,java,algorithm,list,collections,Java,Algorithm,List,Collections,假设有一个具有SomeField属性的SomeClass元素集合。如何从此集合中删除具有等效SomeField属性的重复元素并仅保留一个具有该SomeField值的元素?Java集合有一个可选的删除方法。假设您正在处理的集合支持它,您可以使用它: 布尔删除(对象o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作) 假设集合有一个add方法,则可以在元素存在时(使用contains检查)运行一个循环,从集合中删除该元素,但一旦该元素没有add方法,就可以执行该循环 while(myCol

假设有一个具有SomeField属性的SomeClass元素集合。如何从此集合中删除具有等效SomeField属性的重复元素并仅保留一个具有该SomeField值的元素?

Java集合有一个可选的
删除方法。假设您正在处理的集合支持它,您可以使用它:

布尔删除(对象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
更复杂,您仍然可以使用
集合
。但是,您需要以某种方式过滤掉重复项,一种好的方法是将
比较器与