W jaki sposób dodać element do dwuwymiarowej ArrayList?

0

Witam
W jaki sposób mogę dodać element do dwuwymiarowej ArrayList?
Próbowałem w ten sposób jednak pojawia się błąd:

Error:(189, 21) error: array required, but ArrayList<ArrayList<Tower>> found

    ArrayList<ArrayList<Tower>> Towers_W = new ArrayList<ArrayList<Tower>>(Towers);
...
            Tower TT = new Tower();
            Towers_W[0].add(TT); //Błąd
1
Towers_W.get(0).add(TT);

a najlepiej napisz ten kod jeszcze raz, bo to jest jeden wielki WTF

dodanie znacznika <code class="java"> - @furious programming

1

Dobrze byłoby to w ten sposób zorganizować.

world.addTurretAt(turret, position)
0

@NoZi
Co z moim kodem jest złego poza oczywiście dodawaniem elementu?
W jaki lepszy sposób można to przedstawić niż używanie dwuwymiarowej tablicy?
Tower - klasa zawierająca pola oraz metody dotyczące wież
1 wymiar - ilość rodzajów wież - const
2 wymiar - ilość poszczególnych wież

Dodawanie wież będzie realizowany tylko w jednym miejscu programu, więc zastanawiam się czy jest sens tworzyć do tego osobną metodę.

1

Podejrzewam, że dużo masz źle - wrzuć więcej kodu. Zmień ten nic nie mówiący podział wiersz - rodzaj wieży, np prymitywnie;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

interface Tower {
    int getHeight();

    int getPrice();
}

class StandardTower implements Tower {
    private int height;
    private int price;
    private String name;

    public StandardTower(String name, int height, int price) {
        this.name = name;
        this.height = height;
        this.price = price;
    }

    @Override
    public int getHeight() {
        return height;
    }

    @Override
    public int getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return name;
    }
}

class TowerCategories {
    public static final int EXPENSIVE_DETERMINANT = 6;
    public static final int HEIGHT_DETERMINANT = 7;

    public static List<Tower> getExpensiveTowers(Collection<Tower> towers) {
        List<Tower> res = new ArrayList<Tower>();
        for (Tower t : towers) {
            if (t.getPrice() > EXPENSIVE_DETERMINANT)
                res.add(t);
        }
        return res;
    }

    public static List<Tower> getHighTowers(Collection<Tower> towers) {
        List<Tower> res = new ArrayList<Tower>();
        for (Tower t : towers) {
            if (t.getHeight() > HEIGHT_DETERMINANT)
                res.add(t);
        }
        return res;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Tower> towers = new ArrayList<Tower>(Arrays.asList(
                new StandardTower("aaa", 5, 8),
                new StandardTower("bbb", 9, 12),
                new StandardTower("ccc", 8, 6)
        ));
        System.out.println(TowerCategories.getExpensiveTowers(towers));
        System.out.println(TowerCategories.getHighTowers(towers));
    }
}

http://ideone.com/W1dMDq

0

Kod związany z klasą Tower w głównym pliku stanowił tylko kilka wierszy, reszta kodu jest związana z generowaniem mapy.
Dlaczego lepiej używać

	private int X;
@Override
    public int getX() {
        return X;
    }

niż public int X?

Kod funkcji generującej:

   

int MapX = 10;
int MapY = 5;

int[][] MapW = new int [MapX][MapY];
int[][] MapR = new int [MapX][MapY];

Random Ran = new Random();

public void Generating() {

        int Y = Ran.nextInt(MapY);
        int X = 0;
        int KS = 0;
        int KT = 0;

        boolean BT = false;

        for (short TB_01 = 0; TB_01 < MapX; ++TB_01) {

            for (short TB_02 = 0; TB_02 < MapY; ++TB_02) MapW[TB_01][TB_02] = 0;

        }

        while (true){

            MapW[X][Y] = 1;

            if (KT == 0) MapR[X][Y] = 1;
            else MapR[X][Y] = 0;

            if (KS != KT){

                int XT = X;
                int YT = Y;

                if (KT == 0) --XT;
                else    if (KT == 1) --YT;
                else    if (KT == 2) ++YT;

                if (XT >= 0 && XT < MapX && YT >= 0 && YT < MapY) {

                    MapW[XT][YT] = 2;

                            if (KS == 0 && KT == 1) MapR[XT][YT] = 0;
                    else    if (KS == 0 && KT == 2) MapR[XT][YT] = 1;
                    else    if (KS == 1 && KT == 0) MapR[XT][YT] = 2;
                    else    if (KS == 2 && KT == 0) MapR[XT][YT] = 3;

                }

            }

            KS = KT;
            KT = Ran.nextInt(3);

            while (Check_01 (MapX, MapY, X, Y, KT, MapW, MapR)){

                if (KT == 0){

                    BT = true;

                    break;

                }else if (KT == 1){

                    KT = Ran.nextInt(2);
                    if (KT == 1) ++KT;
                    if (KT == KS) KT = 0;

                }else if (KT == 2){

                    KT = Ran.nextInt(2);
                    if (KT == KS) KT = 0;

                }

            }

            if (BT) {

                if (KS != KT){

                    MapW[X][Y] = 2;

                    if (KS == 0 && KT == 1) MapR[X][Y] = 0;
                    else    if (KS == 0 && KT == 2) MapR[X][Y] = 1;
                    else    if (KS == 1 && KT == 0) MapR[X][Y] = 2;
                    else    if (KS == 2 && KT == 0) MapR[X][Y] = 3;

                }

                break;

            }

            if (KT == 0) ++X;
            else    if (KT == 1) ++Y;
            else    if (KT == 2) --Y;

        }

        int T = Ran.nextInt(10);

        for (int TB_01 = 0; TB_01 < T; ++TB_01){

            int XR = Ran.nextInt(MapX);
            int YR = Ran.nextInt(MapY);

            if (MapW[XR][YR] == 0) {

                MapW[XR][YR] = Java_B_N;

            }

        }

        SetDraw();

    }

   public boolean Check_01(int MapX, int MapY, int X, int Y, int KT, int[][] MapW, int[][] MapR){

        int XT = X;
        int YT = Y;

        if (KT == 0 && X + 1 >= MapX) return true;
        if (KT == 1 && Y + 1 >= MapY) return true;
        if (KT == 2 && Y <= 0) return true;

        if (KT == 0) ++XT;
        else    if (KT == 1) ++YT;
        else    if (KT == 2) --YT;

        if (XT >= 0 && XT < MapX && YT >= 0 && YT < MapY){

            if (MapW[XT][YT] != 0) return true;

        }

        return false;

    }
1
Kamil9132 napisał(a):

Dlaczego lepiej używać

	private int X;
@Override
    public int getX() {
        return X;
    }

niż public int X?

Bo przy public int X nie masz kontroli nad tym, kto może zmienić wartość tej zmiennej. Jeśli kiedyś wartość będzie dziwna to będziesz latać po wszystkich klasach szukając tej, która to zmodyfikowała.

Zmienne 1, 2-literowe są złe! (Chyba) jedynym wyjątkiem są zmienne iterujące w pętlach, bo każdy wie co to jest i w for (int i = 0;.... Zmienna ma mówić co ona trzyma. Zobacz o ile łatwiej się czyta kod @karolinaa, bo nie musisz się głowić co znaczy KS, a co KT.

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