Problem z generyczną ArrayList

0

Witam, mam problem z moją ArrayListą a właściwie jedną z jej metod. Otóż chcę stworzyć ArrayListę klasy Box<Integer, String>:

ArrayList<Box<Integer,String>> lista = new ArrayList<Box<Integer,String>>(); 

Wszystko ładnie działa, lecz chciałem stworzyć metodę add(obj) która podmieniła by element gdybym próbował dodać element, który zawiera już istniejący identyfikator (nie mylić z indeksem). Dla rozjaśnienia

Mamy ArrayListę:
1 Arek
2 Kasia
3 Marysia

Próbujemy dodać obiekt np
2 Julia

po tej operacji nasza ArrayLista powinna wyglądać tak:
1 Arek
2 Julia
3 Marysia

Oto jak próbowałem się za to zabrać:

 public void add(Box<Integer, String> o)
	{
		for(Box<Integer, String> i: lista)
		{
			if(o.getKey().equals(i.getKey()))
			{
				lista.set(lista.indexOf(i), o);
			}
			else
			{
			lista.add(o);
			}
		}
	}

Lecz niestety, metoda działa tak, że nic do ArrayListy się nie dodaje. Proszę o pomoc i wskazówkę co robię źle. Dziękuję i pozdrawiam

0
  1. Ty chyba chcesz mieć Map a nie List skoro masz klucze i chcesz po nich wyszukiwać...
  2. Nie możesz modyfikować listy po której iterujesz bo się to wywali! Przerwij pętlę zanim będziesz zmieniał listę.
0

ad 2. No chyba, że masz CopyOnWriteArrayList

0
  1. Wiem, że mapa była by o wiele lepsza, lecz założenie jest takie, że trzeba użyć takiej ArrayListy
public void add(Box<Integer, String> o)
    {
        for(Box<Integer, String> i: lista)
        {
            if(o.getKey().equals(i.getKey()))
            {
                lista.set(lista.indexOf(i), o);
                break;
            }
            else
            {
            lista.add(o);
            }
        }
}

Jeżeli o to chodziło w punkcie 2, to lista nadal pozostaje pusta

0

A to ciekawe: "zostaje pusta"? Czyli co była już wcześniej pusta. No to wszystko jasne. Z pustego i Salomon nie wyciągnie indeksu, którego tam nie ma.

0

Kod ma trzy błędy:

  • jeśli lista jest pusta, to pętla for się nie wykona, zatem żadnego elementu nie dodasz,
  • nadal nie przerywasz wykonywania pętli przed dodaniem elementu,
  • nawet gdyby lista pozwalała na modyfikowanie podczas iterowania, to kod działał by źle, zazwyczaj dodawałbyś ten sam element wielokrotnie.
    Spróbuj tak:
public void add(Box<Integer, String> o)
{
    boolean newElement = true;
    for(Box<Integer, String> i: lista)
    {
        if(o.getKey().equals(i.getKey()))
        {
            lista.set(lista.indexOf(i), o);
            newElement = false;
            break;
        }
    }
    if(newElement)
    {
        lista.add(o);
    }
}
0
public void add(Box<Integer, String> o)
    {
        lista.remove(o.getKey());
        lista.add(o.getKey(), o);
    }

co wazne wszystkie elemtny do listy powinny byc dodawane w ten sposob:
lista.add(o.getKey(), o.getString());

i musisz wziac pod uwage IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())

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