Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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 基于属性获取列表中的重复元素,而不使用for循环_Java - Fatal编程技术网

Java 基于属性获取列表中的重复元素,而不使用for循环

Java 基于属性获取列表中的重复元素,而不使用for循环,java,Java,我需要得到一个有一个公共属性的重复对象列表 该列表具有以下提到的值 SomeType someObject1 = new SomeType ("hello1", "1"); SomeType someObject2 = new SomeType ("hello1", "2"); SomeType someObject3 = new SomeType ("hello", "1"); SomeType someObject4 = new SomeType ("hello2", "2"); SomeT

我需要得到一个有一个公共属性的重复对象列表

该列表具有以下提到的值

SomeType someObject1 = new SomeType ("hello1", "1");
SomeType someObject2 = new SomeType ("hello1", "2");
SomeType someObject3 = new SomeType ("hello", "1");
SomeType someObject4 = new SomeType ("hello2", "2");
SomeType someObject5 = new SomeType ("hello2", "1");
SomeType someObject6 = new SomeType ("hello3", "2");
SomeType someObject7 = new SomeType ("hello4", "1");
SomeType someObject8 = new SomeType ("hello5", "2");
我需要获取共享公共第一个参数的对象 在本例中,someObject1、someObject2、someObject4、someObject5 在一个单独的列表中


是否有不在for或while循环中迭代的api可用。

根据契约实现
Object.equals(Object)
Object.hashCode(
),以便两个输入值确定相等和hashCode。将所有对象放入一个
HashMap

把自己当作钥匙。然后,当您需要它们时,使用新对象作为键查询哈希映射,您将准确地获得所需的对象。

根据它们的约定实现
Object.equals(Object)
Object.hashCode(
),以便两个输入值确定相等和hashCode。将所有对象放入一个
HashMap

把自己当作钥匙。然后,当您需要它们时,使用新对象作为键查询哈希映射,您将获得所需的对象。

据我所知,您需要所有重复的对象。一个简单的方法是使用Set集合,它不允许重复并检查未成功的插入。为此,需要从对象中重写equals方法

public List<SomeObject> getDuplicates(List<SomeObject> objects) {
 Set<SomeObject> uniqueObjects = new HashSet<SomeObject>();
 List<SomeObject> duplicates = new ArrayList<SomeObject();

 for(SomeObject so : objects) {
  if(!uniqueObjects.add(so)) {
   duplicates.add(so);
  }
 }
 return duplicates;
}
public List getDuplicates(列表对象){
Set uniqueObjects=new HashSet();

List duplicates=new ArrayList据我所知,您需要所有副本。一种简单的方法是使用不允许重复的集合,并检查未成功的插入。为此,您需要覆盖对象中的equals方法

public List<SomeObject> getDuplicates(List<SomeObject> objects) {
 Set<SomeObject> uniqueObjects = new HashSet<SomeObject>();
 List<SomeObject> duplicates = new ArrayList<SomeObject();

 for(SomeObject so : objects) {
  if(!uniqueObjects.add(so)) {
   duplicates.add(so);
  }
 }
 return duplicates;
}
public List getDuplicates(列表对象){
Set uniqueObjects=new HashSet();

List duplicates=new ArrayList我相信您希望使用
哈希集

首先修改
SomeType
,使
等于
hashCode
仅使用第一个字段。假设您将其命名为
field1

  • equals
    仅当两个对象的
    field1
    相等时才应返回
    true
  • hashCode
    应返回
    field1.hashCode
这将导致具有与
字段1
相同值的
SomeType
实例被放入
哈希集
的同一个存储桶中:

Set<SomeType> set = new HashSet<SomeType>()
set.add(new SomeType("field1", "foo"))
set.add(new SomeType("field1", "bar"))
// At this point, set only contains SomeType("field1", "bar")
Set=newhashset()
添加(新的SomeType(“field1”、“foo”))
添加(新的SomeType(“field1”、“bar”))
//此时,集合仅包含某个类型(“field1”、“bar”)
如果要保留所有实例,但要聚合它们,请使用另一个集合的
HashSet
,例如
HashSet


当然,如果我正确理解了你的问题…

我相信你想使用
哈希集

首先修改
SomeType
,使
等于
hashCode
仅使用第一个字段。假设您将其命名为
field1

  • equals
    仅当两个对象的
    field1
    相等时才应返回
    true
  • hashCode
    应返回
    field1.hashCode
这将导致具有与
字段1
相同值的
SomeType
实例被放入
哈希集
的同一个存储桶中:

Set<SomeType> set = new HashSet<SomeType>()
set.add(new SomeType("field1", "foo"))
set.add(new SomeType("field1", "bar"))
// At this point, set only contains SomeType("field1", "bar")
Set=newhashset()
添加(新的SomeType(“field1”、“foo”))
添加(新的SomeType(“field1”、“bar”))
//此时,集合仅包含某个类型(“field1”、“bar”)
如果要保留所有实例,但要聚合它们,请使用另一个集合的
HashSet
,例如
HashSet

当然,如果我正确理解了你的问题…

请检查,然后你可以这样做:

List<SomeType> someTypes = getSomeTypes();
Multimap<String, SomeType> someTypesByName = Multimaps.index(someTypes, new Function<SomeType, String>() {
    @Override
    public String apply(SomeType someType) {
        return someType.getName();
    }
}
List someTypes=getSomeTypes();
Multimap someTypesByName=Multimaps.index(someTypes,新函数(){
@凌驾
公共字符串应用(SomeType SomeType){
返回someType.getName();
}
}
生成的多重映射someTypesByName本质上是名称到具有该名称的SomeType对象列表的映射。

请检查,然后您可以执行以下操作:

List<SomeType> someTypes = getSomeTypes();
Multimap<String, SomeType> someTypesByName = Multimaps.index(someTypes, new Function<SomeType, String>() {
    @Override
    public String apply(SomeType someType) {
        return someType.getName();
    }
}
List someTypes=getSomeTypes();
Multimap someTypesByName=Multimaps.index(someTypes,新函数(){
@凌驾
公共字符串应用(SomeType SomeType){
返回someType.getName();
}
}

生成的多重映射someTypesByName本质上是名称到具有该名称的SomeType对象列表的映射。

这一点非常不清楚。我们现在可以看到您的输入(部分)。向我们展示您想要的输出,最好是您除了询问我们之外还尝试了什么。您的对象究竟是如何相等的?为什么不在列表中列出1、3、5和7,因为它们都有
“1”
(2、4、6和8以及
“2”
)的共同点。实际上,如果应选择1、2、4和5,则由于
“1”
“2”,这将扩展到所有这些选项
@jlordo我看不出有什么不清楚的地方。OP询问是否有一个集合不允许通过属性或类似的东西复制条目。@jlordo OP显示了所需的输出,但我们需要知道为什么这是所需的输出。这很不清楚。我们现在看到了您的输入(部分)。向我们展示您想要的输出,最好是您除了询问我们之外还尝试了什么。您的对象究竟是如何相等的?为什么不在列表中列出1、3、5和7,因为它们都有
“1”
(2、4、6和8以及
“2”
)的共同点。实际上,如果应选择1、2、4和5,则由于
“1”
“2”,这将扩展到所有这些选项
@jlordo我看不出有什么不清楚的地方。OP询问是否有一个集合不允许通过属性或类似的东西复制条目。@jlordo OP显示了所需的输出,但我们需要知道为什么这样做