NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
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í.

Diskuze – Lekce 12 - ArrayList v Javě

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na Mirka Baranová
pocitac770:21.1.2017 20:03

Tak jsem to vyzkoušel, problém je ten, že to vrací pole výhradně Objectů. To znamená, že to jde vyřešit dvěmi cestami...

  1. Postupně jednotlivé Objecty protypovávat na Stringy, pracovat s nimi, a potenciálně je neskládat do nového pole
  2. Použít v metodě jako parametr pole, které má stený typ (v tomto případě String), pokud bude délka stejná, jako délka listu, pak se rovnou do něj všechny prvky doplní, v opačném případě si to pouze vezme typ a vrátí nové pole. Toho jde využít, když máš již nějaké jiné pole vytvořené a chceš ho znovu použít na toto, pak můžeš doplnit do parametru přímo instanci a vynechat "doplňovací" část před rovnítkem
ArrayList<String> list = new ArrayList<String>();
list.add("Jedna");
list.add("Dva");
//1)
Object[] pole1 = list.toArray();
Sring[] pole2 = new String[pole1.length];
for(int i = 0; i < pole1.length; i++){
        System.out.println((String)pole1[i]);
        pole2[i] = (String)pole1[i];
}
//2.1)
String[] pole3 = list.toArray(new String[list.size()]);
for(String s : pole3){
        System.out.println(s);
}
//2.2)
String[] pole4 = new String[list.size()];
list.toArray(pole4);
for(String s : pole4){
        System.out.println(s);
}
Editováno 21.1.2017 20:04
 
Odpovědět
21.1.2017 20:03
Avatar
Lesní Muž
Člen
Avatar
Odpovídá na Michal Remišovský
Lesní Muž:3.3.2017 18:53

Nene, takhle ti to pojede od 0 do 99.

 
Odpovědět
3.3.2017 18:53
Avatar
Lesní Muž
Člen
Avatar
Lesní Muž:4.3.2017 19:36

Nenašel by se tady nějaký bůh, který by mi vysvětlil tohle, prosím?

String[] poleStringu = {"První", "Druha", "Třetí"};
List<String> l = new ArrayList<String>(Arrays.asList(poleStringu)); //tento řádek prostě nepobírám
System.out.println(l.get(2));
 
Odpovědět
4.3.2017 19:36
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Lesní Muž
David Hartinger:4.3.2017 20:09

Arrays.asList() převede zadané pole na kolekci s rozhraním List, je to potřeba k tomu, aby se mohlo předat při vytváření ArrayListu. Ten řádek nedělá nic jiného, než že vytváří nový ArrayList l, do kterého rovnou vloží prvky z poleStringu.

Odpovědět
4.3.2017 20:09
New kid back on the block with a R.I.P
Avatar
Lesní Muž
Člen
Avatar
Odpovídá na David Hartinger
Lesní Muž:6.3.2017 18:56

Děkuji mnohokrát, já v tom hledal něco složitějšího a to "asList" mě zmátlo. Hned jdu shánět lidi do kultu Davida Čápky!

Editováno 6.3.2017 18:57
 
Odpovědět
6.3.2017 18:56
Avatar
Jakub Bómíček Bohm:9.3.2018 17:48

Věděl by jste někdo, jak je to se Stackem a Heapem u arraylistu ? Třeba pole má v zásobníku referenci na reálné pole v haldě, kde jsou za sebou prvky primitivního typu. O objektů tam jsou teda ještě reference na samotný objekty, protože ty jsou rozházený v haldě. Když do arraylistu integerů přidám nějaké číslo, jak je to s tou pamětí ?

 
Odpovědět
9.3.2018 17:48
Avatar
Jakub Krsička:11.10.2018 1:31

Zdarec, prosím vás mám dotaz už jsem si několikrat všiml problému s cyklem While, aktuálně jsem zpracovával test který byl ve statice, že si objekty dám do arrayListu, jenomže. Pokud switchi nastavím case 4: kde je napsáno, aby se nesplnila podmínka pro další cyklus tak stejně kus kodu v cyklu probehne.... Nevím co s tím. Zde je kod budu rád za rady.

package teststatika1;
import java.util.Scanner;
import java.util.ArrayList;
/**
 *
 * @author krsmen...
 */
public class TestCukrarna {



    ArrayList<Cukrovi> kolekceCukrovi = new ArrayList<Cukrovi>();
    Scanner sc = new Scanner (System.in, "UTF-8");
    int pocetVPoli = 0;

    public void rozhrani()
    {
        vytvoreniCukrovi();
        vypis();
    }

    private void vytvoreniCukrovi()
    {


       boolean konec = true;
       while(konec)
       {
        System.out.println("Vyberte volbu které cukroví chcete vytvořit:\n 1- bananove\n 2- jahodove\n 3- cokoladove\n 4- ukončit podprogram");
        int volba = Integer.parseInt(sc.nextLine());
        System.out.println("Zadejte prosím kolik kusů chcete vytvořit:");
        int pocet = Integer.parseInt(sc.nextLine());
        switch(volba)
        {
            case 1:
            for (int i = 0; i < pocet; i++)
            {
                   kolekceCukrovi.add(TovarnaNaCukrovi.vytvorBananove());
            }
            System.out.println("Bylo "+ pocet + " kusů banánového cukroví");
            break;

            case 2:
            for (int i = 0; i < pocet; i++)
            {
                   kolekceCukrovi.add(TovarnaNaCukrovi.vytvorJahodove());
            }
            System.out.println("Bylo "+ pocet + " kusů jahodového cukroví");
            break;

            case 3:
            for (int i = 0; i < pocet; i++)
            {
                   kolekceCukrovi.add(TovarnaNaCukrovi.vytvorCokoladove());
            }
            System.out.println("Bylo "+ pocet + " kusů cokoladoveho cukroví");
            break;

            case 4:
            System.out.println("Ukončuji podprogram vytváření cukroví");
            konec = false;
            break;

            default:
            System.out.println("Zadali jste špatnou volbu, prosím zadejte znovu.");
            break;
        }
      }
    }
    public void vypis()
    {
        for(int i = 0; i < this.kolekceCukrovi.size();i++)
        {
            System.out.println(kolekceCukrovi.get(i).toString());
        }
    }

}
 
Odpovědět
11.10.2018 1:31
Avatar
Odpovídá na Jakub Krsička
Matúš Olejník:11.10.2018 8:24

A aký kus kódu konkrétne myslíš? Ak je to toto

System.out.println("Zadejte prosím kolik kusů chcete vytvořit:");
int pocet = Integer.parseInt(sc.nextLine());

tak je logické že to zbehne ešte pred ukončením cyklu pretože vyhodnocovanie aká bola zadaná voľba je až za tým.
Môžeš logiku z case 4 vytiahnuť do ifu hneď za načítanie voľby, kde teda ak zistíš že voľba je 4 tak ukončíš cyklus bez toho aby sa vyhodnocoval switch :) Rovnako default case sa ti vykoná až po tom čo zadáš pocet hoci voľba bola mimo dovolených hodnôt.

Odpovědět
11.10.2018 8:24
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Jakub Krsička:11.10.2018 10:15

Ano tomu samozrejme rozumím, jenomže pokud mi vypíše println zadejte hodnotu, já zadám 4 potvrdim enter. Tak i přes to, že vstupní podmínka po ukončení cyklu nesouhlasí tak se mi spustí println, i scanner a další cyklus se ukončí až po těchto řádcích.

 
Odpovědět
11.10.2018 10:15
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na Jakub Krsička
pocitac770:12.10.2018 13:32

Tvůj problém je ten, že proběhne kód za tímto načtením, a teprv pak se to dostane ke switchi, po čemž skončí cyklus. Máš dvě možnosti

  1. To druhé načtení z konzole dát do podmínky, tzn pokud volba není 4, tak má smysl načítat počet, jinak přejdeš dále do switche, takto to můžeš použít i do budoucna na jiné volby, které taktéž nebudou vyžadovat počet
  2. použít v cyklu řádek "break;", ten samý, co znáš ze switche, ukončí to okamžitě právě probíhající cyklus, tímpádem rovnou skočíš na rádek za while cyklem, kde můžeš mít ono rozloučení programu
 
Odpovědět
12.10.2018 13:32
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 10 zpráv z 74.