ArrayList w HashMap – czy za każdym wywołaniem będzie tworzona nowa lista?

0

Mam taki oto pragment kodu:


static ArrayList<Integer> limits = new ArrayList<>();
static HashMap<Integer, ArrayList<Ship>> ships = new HashMap<Integer, ArrayList<Ship>>();


public static Ship getShip(int size) {
.
.
.
    		if(ships.containsKey(size) && ships.get(size).size() < limits.get(size).intValue())
    		{
    			Ship ship = new Ship();
    			ships.put(size, new ArrayList<>());
    			ships.get(size).add(ship);
    		}
.
.
.

I moje pytanie brzmi czy za każdym wywołaniem metody getShip będzie tworzona nowa lista czy tylko wtedy, gdy jej nie będzie przy wartości size?

0

Na 1 rzut oka to nie, ale prawde powiedziawszy ten design niezbyt mi sie podoba
1)O co chodzi z tym limits?
2)Czemu statici nie są final
3)Metoda get coś tworzy
tworzysz jakąs dziwną konstukcje, powiedz lepiej co chcesz osiągnąć ;]

PS
A faktycznie, nie popatrzyłem na warunki dokładnie. Tak za każdym razem doda Ci się nowa lista

0

Za każdym razem jak zrobisz

ships.put(size, new ArrayList<>());

to doda się nowa pusta lista, a stara, która miała wcześniej jeden statek zostanie usunięta.

0

Ok to w takim razie jak zrobić, żeby dla każdego klucza (size) była lista, która się nie usuwa a obiekty są do niej dodawane?

0
Mattii4211 napisał(a):

Ok to w takim razie jak zrobić, żeby dla każdego klucza (size) była lista, która się nie usuwa a obiekty są do niej dodawane?

A dlaczego kluczem w tej mapie jest size?

0

A te intigery (klucze) to czemu odpowiadają? Jaka jest logika za tym? Bo nie jest to kod specjalnie czytelny :P

0
TomRiddle napisał(a):
Mattii4211 napisał(a):

Ok to w takim razie jak zrobić, żeby dla każdego klucza (size) była lista, która się nie usuwa a obiekty są do niej dodawane?

A dlaczego kluczem w tej mapie jest size?

Bo to rozmiar, dla którego powinno być max tyle obiektów ile jest na pozycji size w limits

0
  1. Ściągnij jakieś sensowne IDE do javy, np to IntelliJ.
  2. Tutaj masz kod, tak powinien wyglądać:
package app;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static java.util.Arrays.asList;

public class Application {
    public static void main(String[] args) {
        ShipFactory factory = new ShipFactory(asList(3, 1, 4, 2));
        factory.createShip(0);
        factory.createShip(1);
        factory.createShip(2);
        factory.createShip(3);

        factory.createShip(0);
        factory.createShip(2);
        factory.createShip(3);
    }
}

class Ship {
}

class ShipFactory {
    private final Map<Integer, List<Ship>> lists = new HashMap<>();
    private final List<Integer> limits;

    ShipFactory(List<Integer> limits) {
        this.limits = limits;
    }

    Ship createShip(int index) {
        List<Ship> ships = getList(index);
        Ship ship = new Ship();
        ships.add(ship);
        return ship;
    }

    private List<Ship> getList(int index) {
        List<Ship> ships = getOrCreateList(index);
        if (ships.size() < limits.get(index)) {
            return ships;
        }
        throw new RuntimeException("Limit statków przekroczony");
    }

    private List<Ship> getOrCreateList(int index) {
        if (lists.containsKey(index)) {
            return lists.get(index);
        }
        ArrayList<Ship> list = new ArrayList<>();
        lists.put(index, list);
        return list;
    }
}
0

Dzięki ta metoda getOrCreateList(int index) wyjaśniła sprawę :)
A pisze w Eclipse

0

Trochę zmodyfikowałem twoją metodę ale chyba powinno działać?

private static ArrayList<Ship> getList(int index)
    {
    	ArrayList<ArrayList<Ship>> lists = new ArrayList<ArrayList<Ship>>();
    	if(lists.contains(index))
    		return lists.get(index);
    	else
    	{
    		ArrayList<Ship> list = new ArrayList<>();
    		lists.add(index, list);
    		return list;
    	}	
    }

i dalej w getShip:

                      ArrayList<Ship> counter = getList(size);
    			Ship ship = new Ship();
    			ships.put(size, counter);
    			ships.get(size).add(ship);
    			limits.set(size, limits.get(size) - 1);
0
Mattii4211 napisał(a):

Trochę zmodyfikowałem twoją metodę ale chyba powinno działać?

private static ArrayList<Ship> getList(int index)
    {
    	ArrayList<ArrayList<Ship>> lists = new ArrayList<ArrayList<Ship>>();

No pewnie że nie będzie "działać". Po co niby dodajesz coś do listy która jest tylko lokalnie w metodzie.

Może najlepiej napisz tutaj dokładnie co Twój program miałby robić?

0

Ok mój błąd ale już naprawiłem

 static final ArrayList<ArrayList<Ship>> lists = new ArrayList<>();

private static ArrayList<Ship> getList(int index)
    {
    	if(lists.contains(index))
    		return lists.get(index);
    	else
    	{
    		ArrayList<Ship> counter = new ArrayList<>();
    		lists.add(index, counter);
    	}	
    	return lists.get(index);
    }

w getShip()

Ship ship = new Ship();
    			ships.put(size, getList(size));
    			ships.get(size).add(ship);
    			limits.set(size, limits.get(size) - 1);
0

Coś Ty się tak uparł na te statici?

0
TomRiddle napisał(a):

Coś Ty się tak uparł na te statici?

Bez tego eclipse się czepia pewnie dlatego, że to getShip jest static

0
Mattii4211 napisał(a):
TomRiddle napisał(a):

Coś Ty się tak uparł na te statici?

Bez tego eclipse się czepia pewnie dlatego, że to getShip jest static

To nie eclipse, tylko parser javy. Jeśli piszesz wszystko w metodach static, to każda nowa którą zrobisz też musi być static.

Niestety, to jest bardzo średni sposób rozwoju aplikacji, powinieneś korzystać z niestatycznych, np tak:

class Application {
    public static void main(String[] args) {
        new Application().run();
    }

    public void run() {
          getList(0);
    }

    private ArrayList<Ship> getList(int index)  // nie ma static
    {
    }
}
0

te static wynika z tego, że tak mam w treści zadania (szablonie klasy). Ale mam inne pytanie. stworzyłem test i cały czas zwraca mi java.lang.NullPointerException w linijce, w której chcę zwrócić obiekt ship.

HashMapa wyglada tak:

static HashMap<Integer, List<Ship>> ships = new HashMap<>();

metoda getList()

private static List<Ship> getList(int index)
    {
    	if(ships.containsKey(index))
    		return ships.get(index);
    	else
    	{
    		ArrayList<Ship> counter = new ArrayList<>();
    		ships.put(index, counter);
    	}	
    	return ships.get(index);
    }

fragment metoy getShip(), gdzie tworzę obiekt:

if(ships.containsKey(size) && ships.get(size).size() < limits.get(size-1))
    		{
    			List<Ship> counter = getList(size);
    			Ship ship = new Ship();
    			counter.add(ship);
    			ships.put(size, counter);
    			limits.set(size-1, limits.get(size-1) - 1);
    			return ship;
    		}
    		else if(!ships.containsKey(size) && limits.get(size-1).intValue() > 0)
    		{
    			List<Ship> counter = getList(size);
    			Ship ship = new Ship();
    			counter.add(ship);
    			ships.put(size, counter);
    			limits.set(size-1, limits.get(size-1) - 1);
    			return ship;
    		}

i ta feralna linijka:

return ships.get(size).get(0);

Próbowałem różnych podejść ale za nic nie wiem skąd ten błąd.

0
  1. Co to za chory pomysł, żeby w treści zadania podawać czy metoda ma być static? :D
  2. Czemu sobie wymyśliłeś że metoda getShip() powinna tworzyć statek? Może nazwij ją createShip()?
  3. Najprawdopodobniej jak robisz to ships.get(size), to w mapie ships nie ma obiektu pod kluczem ship. Pewnie go nie dodałeś.
0
TomRiddle napisał(a):
  1. Co to za chory pomysł, żeby w treści zadania podawać czy metoda ma być static? :D
  2. Czemu sobie wymyśliłeś że metoda getShip() powinna tworzyć statek? Może nazwij ją createShip()?
  3. Najprawdopodobniej jak robisz to ships.get(size), to w mapie ships nie ma obiektu pod kluczem ship. Pewnie go nie dodałeś.

1,2 pojęcia nie mam
3 miałem problem z warunkami

1
Mattii4211 napisał(a):
TomRiddle napisał(a):
  1. Co to za chory pomysł, żeby w treści zadania podawać czy metoda ma być static? :D
  2. Czemu sobie wymyśliłeś że metoda getShip() powinna tworzyć statek? Może nazwij ją createShip()?
  3. Najprawdopodobniej jak robisz to ships.get(size), to w mapie ships nie ma obiektu pod kluczem ship. Pewnie go nie dodałeś.

1,2 pojęcia nie mam
3 miałem problem z warunkami

Jak masz wybór to nie rób więcej tych zadań. Nie do tego służą static.

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