【问题标题】:Iteration In Arraylist in JavaJava中Arraylist中的迭代
【发布时间】:2016-07-18 06:19:12
【问题描述】:

例如:

Public Class SomeClass{
      private String value1;
private String value2;
private String value3;
private Double value4;
//getters & setters of above
}

考虑Object(SomeClass) 的输入ArrayList: 对象具有String,String,Stringdouble 类型的变量

`List<SomeClass> inputList = [{a,b,c,32.14},{d,e,f,47.50},{g,h,i,60.23}{j,k,l,47.69},{d,e,f,15.56},{a,b,c,25.41}];`

考虑 inputList 中的 2 个对象:{a,b,c,32.14},{a,b,c,25.41}

如果其他对象{a,b,c,25.41}的对象{a,b,c,32.14}String,String,String.equals(String,String,String)的变量只需将它们的双精度值相加并将其转换为单个对象{a,b,c,57.55}

由于上述原因,我希望得到一些对象的 ArrayList:

List<SomeClass> outputList = [{a,b,c,57.55},{d,e,f,62.66},{g,h,i,60.23},{j,k,l,47.69}];

请告诉我实现上述场景的逻辑?嵌套for循环就可以了

【问题讨论】:

  • 您可以覆盖equalshashCode 变量,以便很容易地注意到什么是相等的。进一步,只需将整个 List 相互比较并总结..
  • 您能否向我们提供您自己编写的代码,以显示您到目前为止所尝试的内容?
  • @KevinEsche 我已经编辑了一些更改

标签: java arraylist data-structures


【解决方案1】:

使用 hashMap 并检查该键是否已经存在,然后通过添加现有的 double 值来更新 double 值,然后放入映射中。

public static void main(String[] args) {
    List<MyObject> list = new ArrayList<MyObject>();
    list.add(new MyObject("a","b","c",new BigDecimal(10.23)));
    list.add(new MyObject("a","b","e",new BigDecimal(10.23)));
    list.add(new MyObject("a","b","c",new BigDecimal(10.23)));
    list.add(new MyObject("a","b","d",new BigDecimal(10.23)));
    Map<MyObject,MyObject> map = new HashMap<MyObject,MyObject>(){
       @Override
    public MyObject put(MyObject key, MyObject value) {
           //synchronize if required
        if (containsKey(key)) {
            value.addDouble(get(key).myDouble);
        }
        return super.put(key, value);
    }
    };

 for (MyObject obj:list) {
        map.put(obj, obj);
    }
    for (MyObject obj : map.values())
    System.out.println(obj);
}

输出:

abd10.230000000000000426325641456060111522674560546875
abc20.460000000000000852651282912120223045349121093750
abe10.230000000000000426325641456060111522674560546875

确保仅在前 3 个属性上使用 hashCode 和 equals。不是双重的。

class MyObject {
    String myProp1;
    String myProp2;
    String myProb3;
    BigDecimal myDouble;

    public MyObject(String myProp1, String myProp2, String myProb3, BigDecimal myDouble) {
        super();
        this.myProp1 = myProp1;
        this.myProp2 = myProp2;
        this.myProb3 = myProb3;
        this.myDouble = myDouble;
    }
    public void addDouble(BigDecimal addValue) {
        myDouble = myDouble.add(addValue);
    }
    @Override
    public int hashCode() {
        final int PRIME = 31;
        int result = 1;
        result = PRIME * result + ((myProb3 == null) ? 0 : myProb3.hashCode());
        result = PRIME * result + ((myProp1 == null) ? 0 : myProp1.hashCode());
        result = PRIME * result + ((myProp2 == null) ? 0 : myProp2.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final MyObject other = (MyObject) obj;
        if (myProb3 == null) {
            if (other.myProb3 != null)
                return false;
        } else if (!myProb3.equals(other.myProb3))
            return false;
        if (myProp1 == null) {
            if (other.myProp1 != null)
                return false;
        } else if (!myProp1.equals(other.myProp1))
            return false;
        if (myProp2 == null) {
            if (other.myProp2 != null)
                return false;
        } else if (!myProp2.equals(other.myProp2))
            return false;
          return true;
        }
      }

【讨论】:

  • equals 和 hashCode 方法可以使用java.util.Objects 类进行简化。在这里查看我的答案或代码codiva.io/p/cb3a388d-41dd-43b6-8ee6-1dd7f5f1df19
  • @Gaurav Agarwal 在哈希码方法中初始化的 int PRIME 是什么?为什么是 31?
  • 关于PRIME的解释请看这篇文章:stackoverflow.com/questions/3613102/…
  • @Gaurava Agarwal Listlist = new ArrayList();您在新的 HashMap 中哪里使用了 list
  • @sundaresan.c,我也添加了所需的代码和输出。如果有帮助,请投票。
【解决方案2】:

首先,定义equalshashCode 方法。建议:不要重新实现轮子。只需使用 java.util.Objects 类的 equalshash 方法。这减少了大量的错误。

@Override
public boolean equals(Object obj) {
  if (obj == null)
  {
     return false;
  }
  if (getClass() != obj.getClass())
  {
     return false;
  }
  final SomeClass other = (SomeClass) obj;

  return   Objects.equals(this.value1, other.value1)
        && Objects.equals(this.value2, other.value2)
        && Objects.equals(this.value3, other.value3);

}

对于组合器,使用 Java 8 的 groupingBy 按键分组的方法(在本例中为标识),您可以将值定义为 value4 字段的总和。

List<SomeClass> list = new ArrayList<>();
list.add(new SomeClass("a", "b", "c", 12.4));
list.add(new SomeClass("a", "b", "c", 31.4));
list.add(new SomeClass("c", "b", "c", 12.4));
list.add(new SomeClass("d", "b", "c", 12.4));


Function<SomeClass,SomeClass> identity = Function.identity();
Map<SomeClass, Double> map = list.stream()
    .collect(Collectors.groupingBy(identity,
        Collectors.summingDouble(SomeClass::getValue4)));

List<SomeClass> result = new ArrayList<>(map.entrySet().stream()
    .collect(Collectors.toMap(Map.Entry::getKey,
         e -> new SomeClass(e.getKey(), e.getValue()))).values());
System.out.println(result);

Codiva online java complier IDE中的完整代码。

【讨论】:

  • JackDaniels 我正在使用 java 7。建议使用相同的组合器方法
  • 您可以使用 Google Guava 库吗?它有很多有用的功能,这将使它更简单
  • codiva.io/p/825fd968-13e0-4dbc-a382-03aa13b96ebd 有使用番石榴库的java7版本
【解决方案3】:

在您的对象中实现 hashCode 和 equals 方法并尝试在集合中添加对象,它将为您提供所需的输出。

@Override
public boolean equals(Object obj) {
    MyObject newObj = (MyObject)obj;

    if (newObj.getA().equals(this.getA()) && newObj.getB().equals(this.getB()) && newObj.getC().equals(this.getC())){
        newObj.setDoubleValue(this.getDoubleValue()+newObj.getDoubleValue());
        return true;
    }
    return false;
}

@Override
public int hashCode() {
    return 1;
}

【讨论】:

  • equals 和 hashcode 需要大量改进。您可以从 IDE 中看到生成的 hashCode equals。对于这个特定的问题,重要的是不要使用 DoubleValue。
  • 那是示例代码..不是直接使用的意思
  • 每个人都应该注意他们所指的内容。感谢您的建议会记住这一点
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 2021-09-26
  • 2012-11-30
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多