有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

该列表具有以下提到的值

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可用


共 (4) 个答案

  1. # 1 楼答案

    我相信你想用HashSet

    首先修改SomeType,使equalshashCode只使用第一个字段。假设你把它叫做^{

    • ^如果两个对象field1相等,{}只应返回true
    • hashCode应该返回field1.hashCode

    这将导致SomeType的实例与field1的相同值被放入HashSet的相同存储桶中:

    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")
    

    如果希望保留所有实例,但要聚合它们,请使用另一个集合的HashSet,例如HashSet<ArrayList<SomeType>>

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

  2. # 2 楼答案

    据我所知,你想要所有的副本。一个简单的方法是使用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;
    }
    
  3. # 3 楼答案

    看看Guava's Multimaps.然后你可以做这样的事情:

    List<SomeType> someTypes = getSomeTypes();
    Multimap<String, SomeType> someTypesByName = Multimaps.index(someTypes, new Function<SomeType, String>() {
        @Override
        public String apply(SomeType someType) {
            return someType.getName();
        }
    }
    

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

  4. # 4 楼答案

    根据契约实现Object.equals(Object)Object.hashCode(),这样两个输入值就决定了等式和hashCode。将所有对象放入HashMap<SomeType, SomeType> 把自己当成钥匙。然后,当您需要它们时,使用新对象作为键查询哈希映射,您将获得所需的对象