Modyfikacje obiektów w ArrayList

0

Witam,
Mam pytanie w jaki sposób mogę edytować elementy w ArrayList?
Chodzi dokładnie o to, że mam utworzone obiekty klasy Zaangazowanie, które znajdują się w ArrayList, niestety niektóre elementy się powtarzają, a dokładniej niektóre Cif się powtarzają.
Problem polega na tym, że na liście nie mogą się powtarzać obiekty o tych samych Cif. Niestety nie wiem jak doprowadzić do sytuacji w której pola zaangICBS dla tych samych Cif zostaną zsumowane i na liście pozostaną tylko unikalne Cif. Macie jakieś propozycje? Do przeglądania ArrayList wykorzystuję Iterator.

public class Zaangazowanie implements Comparable<Object>{
    private int Cif;
    private double zaangICBS=0;
    private double zaangLea=0;

    public Zaangazowanie() {
        // TODO Auto-generated constructor stub
    }

    public Zaangazowanie(int _cif, double _icbs) {
        this.Cif = _cif;
        this.zaangICBS = _icbs;
        this.zaangLea = 0;
    }

    public int getCif() {
        return Cif;
    }

    public void setCif(int cif) {
        Cif = cif;
    }

    public double getZaangICBS() {
        return zaangICBS;
    }

    public void setZaangICBS(double zaangICBS) {
        this.zaangICBS = zaangICBS;
    }

    public double getZaangLea() {
        return zaangLea;
    }

    public void setZaangLea(double zaangLea) {
        this.zaangLea = zaangLea;
    }

    public int compareTo(Object obj) {
        int wynik = String.valueOf(this.Cif).compareTo(String.valueOf(((Zaangazowanie) obj).Cif));

        return wynik;
    }
}
0
  1. Wyciągasz obiekt.
  2. Modyfikujesz.
    Chyba że obiekty są immutable. Wtedy
  3. Usuwasz obiekt z kolekcji.
  4. Modyfikujesz / tworzysz nowy o zmodyfikowanych wartościach.
  5. Wstawiasz do kolekcji.
0

Przed dodaniem nowej wartości do listy musisz sprawdzić czy w liście nie ma już obiektu Zaangazowanie o podanym Cif, jeśli jest to zwiększ jego zaangICBS o tyle ile posiadał element, który chciałeś dodać. Jeśli takiego elementu nie ma to po prostu dodaj nowy element do listy.

Tak na marginesie zmienne należy raczej nazywać z małych liter, więc zamiast

private int Cif;

powinno być private int cif;

0
  1. A czemu to jest ArrayList? Zróbże Map gdzie kluczem będzie ten twój cif i tyle.
  2. To twoje compareTo to woła o pomstę do nieba. Czy ty upadłeś na głowę? http://docs.oracle.com/javase[...]eger.html#compare(int,%20int)
0

Nie, ze cos, ale dlaczego nie mozesz skorzystac z kolekcji Set skoro zalezy Ci na unikalnosci ?

0

@miszasty93, bo trzeba wtedy poprawnie implementować hashCode, a nie zawsze jest to możliwe (czasami unikalność oznacza jedno takie samo pole, a hashCode jest liczony dla "prawdziwej unikalności" z wielu pól), ale wtedy używasz > http://koziolekweb.pl/2014/12[...]l-nie-moze-tam-wrapper-posle/

@gruby555, dla ciebie ten sam link o wrapperze i robieniu unikalnej listy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0