Итерация в Arraylist на Java

java arraylist data-structures

120 просмотра

3 ответа

7 Репутация автора

Например:

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

Рассмотрим ввод ArrayListиз Object(SomeClass): Объект имеет переменные типа String,String,Stringиdouble

`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}];`

Рассмотрим 2 объекта в inputList: {a,b,c,32.14},{a,b,c,25.41}

Если переменные объекта {a, b, c, 32.14} String,String,String.equals (String, String, String) других объектов {a,b,c,25.41}просто суммируют их двойное значение и преобразуют его в один объект {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}];

Пожалуйста, дайте мне знать логику для реализации вышеописанного сценария? Вложенный для цикла будет хорошо

Автор: sundaresan.c Источник Размещён: 18.07.2016 06:19

Ответы (3)


1 плюс

714 Репутация автора

Решение

Используйте hashMap и проверьте, существует ли этот ключ, затем обновите двойное значение, добавив существующее двойное значение, а затем вставьте в карту.

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

Обязательно используйте hashCode и равно только для первых 3 свойств. Не на двойной.

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;
        }
      }
Автор: Gaurava Agarwal Размещён: 18.07.2016 06:50

-1 плюса

124 Репутация автора

Реализуйте методы 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;
}
Автор: Rakesh Размещён: 18.07.2016 07:29

1 плюс

593 Репутация автора

Во- первых, определить equalsи hashCodeметоды. Посоветуйте: не переопределяйте колесо. Просто используйте java.util.Objects class ' equalsи hashметоды. Это уменьшает большое количество ошибок.

@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);

Полный код в онлайн-компиляторе Java- кода Codiva .

Автор: JackDaniels Размещён: 18.07.2016 07:48
Вопросы из категории :
32x32