Problem z generyczną ArrayList

Problem z generyczną ArrayList
Arek Rosenstrauch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

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

Kopiuj
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ć:

Kopiuj
 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

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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ę.
jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
0

ad 2. No chyba, że masz CopyOnWriteArrayList

Arek Rosenstrauch
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0
  1. Wiem, że mapa była by o wiele lepsza, lecz założenie jest takie, że trzeba użyć takiej ArrayListy
Kopiuj
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

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
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.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
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:
Kopiuj
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);
    }
}
KE
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
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())

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.