» »

Rekurzija v javi z ArrayList

DirectX11 ::

Kako bi napisal v javi rekurzivno metodo, pri čemer bi v vsaki iteraciji dodal na ArrayList nek string, in potem na koncu vrnil ArrayList.

Poskusu sem tako, da sem kar znotraj razreda definiral instanco (ArrayList), potem pa sem poskusu v neki metodi to vrnit, pa mi napiše:

non-static variable list1 cannot be referenced from a static context

Zgleda, da v javi ne smem vračat oziroma spreminjat zunanjih spremenljivk.

Če pa definiram znotraj metode Arraylist mi pa vedno pobriše, seveda.

smoke ::

Javi ti napako ker imaš metodo statično, spremenljivke list1 pa ne. Kar je pa seveda logično, ker lahko statično metodo kličeš četudi ne narediš nobenega primerka tega razreda. Pobriši static iz deklaracije metode :). Sicer pa.. pastaj kodo da bomo lažje videli.

Spura ::

Kaksen string bi pa dodal? Poglej si razliko med static in instance variablami in metodami. Drugace pa vedno lahko vedno definiras ArrayList znotraj metode, samo moras ga na koncu in potem dodajas stringe, ko collapsas stack (ali pa alternativno na zacetku, samo je grse).

Zgodovina sprememb…

  • spremenil: Spura ()

DirectX11 ::

Sicer se le še spoznavam z javo, vendar ne razumem zakaj to ne dela.


import java.util.ArrayList;

public class Izpis{
    ArrayList zlist = new Arraylist();
    
    public static void main(String args[]){
        String tabela[] = {"Ljubljana", "Maribor", "Celje"};
        spremeni(tabela);
        System.out.println(zlist.size());
                
    }
    
    public void spremeni(String polje[]){
        for(int i=0; i< polje.length; i++){
            zlist.add(polje[i]);
        }
    }
}



Sedaj boste rekli, da naj ArrayList definiram v metodi "spremeni", vendar jaz tega nočem, ker potrebujem tako.

smoke ::

Težava je v tem da nikoli ne narediš objekta iz razreda Izpis. Kar je sicer vredu, saj ga ne rabiš, ker je metoda main statična. Naredi svoj razred za ta arraylist in tisto metodo.

Takole:
public class A {
    protected ArrayList zlist;
    // konstruktor
    A() { zlist = new ArrayList(); }
    
    // metoda spremeni
    public void spremeni (String[] polje) {
        for (int i = 0 ; i < polje.length ; i++) {
            zlist.add(polje[i]);
        }
    }
    // get/set metodi
    public ArrayList getZlist() { return zlist; }
    public void setZlist(ArrayList list) { zlist = list; }
}


In nato v metodi main narediš primerek tega razreda takole:
A objekt = new A();


In nato kličeš metodo spremeni takole:
objekt.spremeni(tabela);


PS: kode nisem testiral.. mogoče je kakšna sintaktična napaka. :)

LP

Zgodovina sprememb…

  • spremenil: smoke ()

DirectX11 ::

Aja, potem je rešitev dejansko samo v novem razredu, kako drugače pa ne gre? Potem v javi ne morem spreminjat instanc samo berem jih lahko.

Mesar ::

ne lahko daš metodo v metodo pa dubiš rekurzijo ... se lahko kličeš a() v a()
Go big or go home!

Spura ::

Zakaj rabis tako?
Ne deluje, ker je metoda main staticna, torej lahko uporablja samo staticne spremenljike. Staticne spremenljivke so na razredu samem, instancne so pa na vsakem primerku razreda posebaj.
Torej:
public class Izpis {
    String a = "A";
    static String b = "B";
    public static void main(String[] args) {
        a = "C"; // error ker iz staticne metode dostopas do instancne spremenljivke
        b = "C"; // dela
        Izpis primerek1 = new Izpis(); // dva primerka razreda izpis
        Izpis primerek2 = new Izpis();
        primerek1.a = "E"; // na primerkih(instance) lahko dostopamo do instancnih spremenljivk
        primerek2.a = "F";
        System.out.println(primerek1.a); // izpise E
        System.out.println(primerek2.a); // izpise F
        System.out.println(primerek1.b); // izpise C
        primerek1.b = "D";
        System.out.println(primerek1.b); // izpise D
        System.out.println(primerek2.b); // izpise tudi D, ker si je staticna spremenljivka na razredu Izpis, in si oba primerka lastita isto
        System.out.println(Izpis.b); // pravilen nacin naslavljanja staticnih variabel je po razredu, je pa to ista variabla kot v zgornjih dveh vrsticah
        // oziroma pravilneje, je ista vrednost/objekt
    }


Na zacetku si redu da bi rad rekurzivno metodo:
public class Izpis() {
    private static List<String> spremeni(String[] polje) {
        return spremeni(polje, 0);
    }
    private static List<String> spremeni(String[] polje, int idx) {
        if (idx == polje.length) {
            return new ArrayList<String>();
        } else {
            List<String> retList = spremeni(polje, idx + 1);
            retList.add(0, polje(idx));
            return retList;
        }
    }
    static List<String> zlist;
     
    public static void main(String args[]){
        String tabela[] = {"Ljubljana", "Maribor", "Celje"};
        zlist = spremeni(tabela);
        System.out.println(zlist.size()); 
    }
}
To kar si pa ti pisal s for loopom pa ni rekurzivna metoda.

DirectX11 je izjavil:

Aja, potem je rešitev dejansko samo v novem razredu, kako drugače pa ne gre? Potem v javi ne morem spreminjat instanc samo berem jih lahko.

Ne. Vedno jih lahko beres in pises. Razen ce so deklarirane final, final spremenljivke lahko pises samo enkrat.

Zgodovina sprememb…

  • spremenil: Spura ()

DirectX11 ::

Sedaj mi je že več jasno, hvala za pomoč.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[JAVA] String problem!

Oddelek: Programiranje
15682 (379) Sergio
»

Java-random-polje

Oddelek: Programiranje
6348 (227) LeQuack
»

c# kako v prvi IEnumerable addati samo "Accaptable" tipe iz drugega IEnumerabla

Oddelek: Programiranje
5390 (314) commissar
»

[java] uporaba baze .mdb z javo

Oddelek: Programiranje
51004 (919) gtu
»

[java] funkcija ekvivalentna print_r v PHP

Oddelek: Programiranje
16818 (581) sverde21

Več podobnih tem