• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy takie deklarowanie tablicy dynamicznej w Javie jest poprawne?

VPS Starter Arubacloud
+1 głos
287 wizyt
pytanie zadane 13 maja 2022 w Java przez Mavimix Dyskutant (8,390 p.)

Czy takie deklarowanie tablicy, jest poprawne?

int liczba1 = 10;
int liczba2 = 5;

int[][] nazwa_tablicy;
nazwa_tablicy = new int[liczba1][liczba2];
int[][] nazwa_tablicy2 = new int[liczba1][liczba2];

Jest może jakiś inny sposób w jaki mogę wykonać tablicę dwuwymiarową o wielkości jakiejś zmiennej, np. podanej przez użytkownika?

2 odpowiedzi

+2 głosów
odpowiedź 13 maja 2022 przez Wiciorny Ekspert (269,120 p.)
wybrane 17 maja 2022 przez Mavimix
 
Najlepsza

Jeśli to ma być "tablica-dynamiczna", nie LISTA oparta na tablicy, to deklaracja jest prawidłowa.
Nie ma jednoznacznie wskazania- jak powinno się to robić, więc generalnie, zależy od twojej struktury kodu. 
Dużo lepiej jednak jest to zrobić, bez dodatkowych PRYMITYWNYCH ZMIENNYCH na stosie Javy ( nie ma tez zasad niedeklarowania tablic statycznych)

int[][] static_tablica= new int[10][5]; // gdy znasz wartosci i ma byc statyczna
int[][] dynamic_tablica = new int[x][y]; 

w przeciwnym wypadku, tak jak piszesz jest poprawnie. Niemniej jednak  pozostawienie samej deklaracji 

int[][] nazwa_tablicy;

nie ma praktycznego zastosowania -też może powodować pewne niejasności z jaką wielkością tablic mamy doczynienia z punktu programistty.
Jeśli natomiast zależy Ci na "obiektowych wlasciwosciach" i ma to być lista, wtedy poprawnie jest : 
 

List<String> listFromArray = Arrays.asList(array); // gddzie array to tablica

dla dwóch wymiarów Iinteger to np.

List<List<String>> listOfLists = new ArrayList<List<String>>();

a jeśli sama pusta lista to 

List<String> list = new ArrayList<String>();

Należy ściśle zaznaczyć, że TYP ZMIENNEJ powinien być Interfejsem, a nie typem samego obiektu. 

1
komentarz 14 maja 2022 przez Mavimix Dyskutant (8,390 p.)

Dzięki za odpowiedź. Rozwiniesz ten temat, proszę?:

Należy ściśle zaznaczyć, że TYP ZMIENNEJ powinien być Interfejsem, a nie typem samego obiektu.

Co w przypadku gdy np. mam klasę i chcę zrobić listę obiektów tej klasy? Nie mogę po prostu zrobić:

 

class mojaKlasa
{
///kod
}

List<mojaKlasa> list = new ArrayList<mojaKlasa>();

???

komentarz 15 maja 2022 przez Wiciorny Ekspert (269,120 p.)
edycja 15 maja 2022 przez Wiciorny

To jest prawidłowe, ale zauważ, że mówimy o typie zwracanym w postaci referencji, a nie tym przypisywanym. Przypisywany typ zmiennej jest Tablicą obiektów ArrayList<Obiekt_klasy>
Natomiast REFERENCJA- to jest wskaźnik na typ powinien być typu INTERFEJSU o ile w skład tej kolekcji istnieje taki. i tutaj masz dokłądnie List< ? extends T> ... Liste w twoim przypadku obiektów mojaKlasa, ale dalej to jest INTERFEJS List. 
Czyli List jako interfejs, przyjmuje ArrayList i np. jeśli chcesz zrobić tablice linkowaną poprawnie i możliwe będzie zapisanie również jeśli np chciałbyś przypisać kiedyś lub zmieniać 

List<mojaKlasa> list = new LinkedList<mojaKlasa>();

natomiast nie powinieneś zapisywać

ArrayList<mojaKlasa> list = new ArrayList<mojaKlasa>();

dlaczego? Wyobraź sobie funkcje w programie którą piszesz i chcesz JAKO argument przekazać jej liste....  jeśli napiszesz coś takiego 

static void metodaPrzyjmujacaListe(ArrayList<mojaKlasa> mojaKlasaLista);

To do tej metody PRZEKAŻESZ TYLKO LISTE KTÓRA JEST ARRAYLIST, co jeśli miałyś przeróżne listy Linkowane, ArrayListy etc i w sumie chciał na nich niezależnie od rodzaju wyoknać operacje wtedy podanie listy LinkedList  do metody jest niemożliwe natomiast zapis 

static void metodaPrzyjmujacaListe(List<mojaKlasa> mojaKlasaLista);

pozwala Ci przekazać jako argument KAŻDY TYP LISTY, który tylko zawiera obiekty mojaKlasa, może to być LinkedList, ArrayList  RoleList, VECTOR nawet https://docs.oracle.com/javase/8/docs/api/java/util/List.html

komentarz 17 maja 2022 przez Mavimix Dyskutant (8,390 p.)
Dzięki za wyjaśnienie
0 głosów
odpowiedź 19 maja 2022 przez Czarus0 Obywatel (1,040 p.)
Cześć! Jest to jak najbardziej prawidłowe zadeklarowanie tablicy dwuwymiarowej. Wystarczy teraz, że poprosisz użytkownika o podanie wartości dla ‚liczba1’ i ‚liczba2’, wtedy będziesz miał tablice o podanych przez niego wymiarach.

Raczej nie widzę sposobu na inną deklarację. Chyba, że chcesz mieć listę dwuwymiarową a nie tablicę. Wtedy korzystasz z List<List<Integer>> = new ArrayList<>().

Pozdrawiam!
komentarz 19 maja 2022 przez Mavimix Dyskutant (8,390 p.)
dzięki

Podobne pytania

0 głosów
2 odpowiedzi 449 wizyt
pytanie zadane 2 czerwca 2021 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
1 odpowiedź 177 wizyt
pytanie zadane 7 października 2019 w Java przez Szczurek431 Początkujący (330 p.)
0 głosów
1 odpowiedź 942 wizyt

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...