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

2018-10-29 21:19
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?

edytowany 1x, ostatnio: furious programming, 2018-10-29 21:35

Pozostało 580 znaków

2018-10-29 21:46
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


Nie pomagam przez PM. Pytania zadaje się na forum.
edytowany 2x, ostatnio: scibi92, 2018-10-29 21:52

Pozostało 580 znaków

2018-10-29 21:50
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.


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? - Mattii4211 2018-10-29 21:52
nie odpisuje się w komentarzach... one służą do offtopu - scibi92 2018-10-29 21:54

Pozostało 580 znaków

2018-10-29 21:55
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?

Pozostało 580 znaków

2018-10-29 21:56
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?


Pozostało 580 znaków

2018-10-29 21:57
0

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


Nie pomagam przez PM. Pytania zadaje się na forum.

Pozostało 580 znaków

2018-10-29 21:57
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

Pozostało 580 znaków

2018-10-29 22:25
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;
    }
}

Pozostało 580 znaków

2018-10-29 22:30
0

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

edytowany 1x, ostatnio: furious programming, 2018-10-29 22:53
Nie cytuj całego posta, jeśli odpowiadasz zaraz pod nim i do jego całości się odnosisz. - furious programming 2018-10-29 22:53

Pozostało 580 znaków

2018-10-29 23:09
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);

Pozostało 580 znaków

2018-10-29 23:10
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ć?


Pozostało 580 znaków

Liczba odpowiedzi na stronę

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