Diskuze: Metoda na prevod poli

Java Java Metoda na prevod poli

Avatar
Juraj Rojik
Člen
Avatar
Juraj Rojik:

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
Redaktor
Avatar
Odpovídá na Juraj Rojik
vita:

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.