IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Juraj Rojik
Člen
Avatar
Juraj Rojik:17.7.2015 18:00

Potreboval by som metodu na prevod dinamickeho pola na staticke pole.

Mam dva problemy:

  1. aku navratovu hodnotu mozem dat do metody ak chcem aby mi vracala pole, ale vyalokovane staticke pole
  2. ako previest pole (Integer) na pole (int)

prikladam aj navrh, ale dalej neviem ako.

dakujem

import java.util.*;

public class Hlava{
        public static void main(String[] args){

                Zmena zme = new Zmena();
                Scanner sc = new Scanner(System.in);
                int dimenzia;
                zme.velkost = sc.nextInt();
                zme.zmena(zme.velkost);
        }
}
~

public class Zmena{

        public int velkost;

        public void zmena(int velkost){
                ArrayList<Integer> dim = new ArrayList<Integer>(velkost);
                for(int i=0;i<velkost;i++){
                        dim.add(1);
                }
                Integer s_pole[] = new Integer[dim.size()];
                s_pole = dim.toArray(s_pole);
        }
}
 
Odpovědět
17.7.2015 18:00
Avatar
vita
Tvůrce
Avatar
Odpovídá na Juraj Rojik
vita:27.8.2015 15:39

Ahoj,
dynamické pole v Javě neexistuje. Pokud vytvoříš pole (Array) v Javě, má toto pole fixní délku, kterou nemůžeš měnit. Pokud chceš větší pole, je třeba vytvořit pole další s jinou délkou.

Pole je kontejner, který obsahuje fixní počet hodnot určitého typu.

Vhodným datovým typem s proměnnou velikostí je seznam (List). Třída java.util.List je rozhraní a její nejpoužívanější implementací je ArrayList.

1.
Pokud chceš, aby ti metoda vracela pole (pole má fixní délku), návratovým typem metody musí být Array.

public int[] getPole() {
        int[] pole = new int[5];
        return pole;
}

2. a.
Převod mezi "velkým datovým typem" - objektem (v tomto případě Integer) a "malým datovým typem" (v tomto případě int) se děje automaticky tzv. autoboxing vs autounboxing. To znamené, že by mělo být jedno, zda používáš int[] pole nebo Integer[] pole.

int[] iPole = {1, 2, 3};
Integer[] IPole = {new Integer(1), new Integer(2), new Integer(3)};

for (int i = 0; i < 3; i++) {
        System.out.println(iPole[i]);
        System.out.println(IPole[i]);
}

Výstup:

1
1
2
2
3
3

Jediným problémem, který mě napadá, by byla situace, kdy by pole obsahovalo též null.

2. b.
Převod z ArrayList<Integer> na int[] můžeš provést následujícím způsobem (podobné by to bylo i pro Integer[] na int[]).

ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    list.add(i);
}

int[] pole = new int[list.size()];
for (int j = 0; j < pole.length; j++) {
        pole[j] = list.get(j);
}
System.out.println(Arrays.toString(pole));

Výstup:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Pokud by list mohl obsahovat i hodnoty null, je nutné nejdříve hodnotu otestovat a teprve poté ji přiřadit do pole (jinak by byla vyhozena NullPointerEx­ception).

ArrayList<Integer> list = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        list.add(i);
}
list.add(null);         // přidávám do listu null hodnotu

int[] pole = new int[list.size()];
for (int j = 0; j < pole.length; j++) {
        if (list.get(j) != null) {
                pole[j] = list.get(j);
        } else {
                pole[j] = 0;    // může se přidat jiná hodnota nebo nepřidávat vůbec
        }
}
System.out.println(Arrays.toString(pole));

Výstup:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
 
Nahoru Odpovědět
27.8.2015 15:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.