Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 13. diel - ArrayList v Jave

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
pocitac770
Tvůrce
Avatar
Odpovedá 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);
}
Editované
Avatar
Lesní Muž
Člen
Avatar
Odpovedá na Michal Remišovský
Lesní Muž:3.3.2017 18:53

Nene, takhle ti to pojede od 0 do 99.

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));
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá 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.

Odpovedať
New kid back on the block with a R.I.P
Avatar
Lesní Muž
Člen
Avatar
Odpovedá 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!

Editované
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í ?

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());
        }
    }

}
Avatar
Odpovedá 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.

Odpovedať
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovedá 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.

Avatar
pocitac770
Tvůrce
Avatar
Odpovedá 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
Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 74.