Avatar
švrčajs
Člen
Avatar
švrčajs:

Zdarec, potřeboval bych pomoc s jedním úkolem, jedná se o napsání metody na formátování stringu String formatStr(String format, Object... args) a použivat se to má takto: formatStr("A: %0; B: %1", 1, "XY"); // ===> "A: 1; B: XY"

string jsem si převedl na pole charu, a jednotlivě procházel, do té doby, než jsem narazil na '%' tento znak jsem nahradil mezerou a následující znak prvním objektem, v to první případě by to šlo, ale u B už nastal problém s velikostí pole. Nevíte někdo co s tím ?

 
Odpovědět 22.10.2014 15:56
Avatar
švrčajs
Člen
Avatar
švrčajs:
public String formatStr(String format, Object... args){
                char[] znaky = format.toCharArray();
                int pozice = 0;
                for (int i = 0; i < znaky.length; i++){
                        if (znaky[i] == '%'){
                                znaky[i] = ' ';
                                znaky[i +1] = (Char)args[pozice];
                                pozice++;
                        }
                }

                return "a";
        }

takto nějak bych to chtěl řešit, ale nějak jsem se na tom zasekl.

 
Nahoru Odpovědět 22.10.2014 15:59
Avatar
tomisoka
Redaktor
Avatar
Odpovídá na švrčajs
tomisoka:

Můžeš použít ArrayList<Cha­racter> a pak to převést zpátky do Stringu

 
Nahoru Odpovědět 22.10.2014 16:19
Avatar
švrčajs
Člen
Avatar
Odpovídá na tomisoka
švrčajs:

tak nakonec jsem to udělal jinak..

public static String formatStr(String format, Object... args){
    String vrat = "";
    for (int i = 0; i < format.length(); i++) {
        char znak = format.charAt(i);
        if (znak == '%') {
            i++;
            int pozice = Character.getNumericValue(format.charAt(i));
            vrat += args[pozice].toString();
        } else {
           vrat += znak;
        }
    }
    return vrat;
}
 
Nahoru Odpovědět 22.10.2014 17:47
Avatar
Hit
Člen
Avatar
Odpovídá na švrčajs
Hit:

Vyřešil bych to takhle:

public String formatStr(String format, Object... args){
        String output = "";
        int index = 0;
        char c;

        for (int i = 0; i < format.length(); i++){
            c = format.charAt(i);
            if ( c == '%'){
                output +=  "" + args[index];
                index++;
                i++;
            }else{
                output += format.charAt(i);
            }
        }
        return output;
       }
Nahoru Odpovědět 22.10.2014 17:48
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
Hit
Člen
Avatar
Odpovídá na Hit
Hit:

Sakra, koukám, že píšu pozdě :D

Nahoru Odpovědět 22.10.2014 17:48
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
švrčajs
Člen
Avatar
Odpovídá na Hit
švrčajs:

Nevadí :D i tak dík ;)

 
Nahoru Odpovědět 22.10.2014 17:53
Avatar
švrčajs
Člen
Avatar
švrčajs:

Jenom takový dotaz, bylo mi doporučeno to řešit pomocí stringbuilderu, jenže z knížky jsem to nepobral a na netu nic moc vysvětlení není.. Nějaký nápad na řešení ?

 
Nahoru Odpovědět 27.10.2014 20:34
Avatar
Hit
Člen
Avatar
Odpovídá na švrčajs
Hit:

Nikdy jsem s tím nepracoval, takže nevím jestli to používám správně, ale funguje to :D. Jinak řekla ti ta osoba, která ti to doporučila důvod?

public String formatStr(String format, Object... args){
        int index = 0;
        char c;

        StringBuilder sb = new StringBuilder(format.length());

        for (int i = 0; i < format.length(); i++){
            c = format.charAt(i);
            if ( c == '%'){
                sb.append(args[index]);
                index++;
                i++;
            }else{
                sb.append(c);
            }
        }
        return sb.toString();
       }
Editováno 27.10.2014 21:56
Nahoru Odpovědět 27.10.2014 21:54
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na švrčajs
David Čápka:

V Javě jsou řetězce read-only, takže když spojíš 2 do sebe, tak se musí vždy vytvořit nová instance. To může být někdy zbržďující, hlavně když připojuješ třeba po znaku. Proto existují tyto buildery, které instanci stringu vyrobí až na konci.

Nahoru Odpovědět 27.10.2014 21:59
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Hit
Člen
Avatar
Odpovídá na David Čápka
Hit:

Díky za osvětlení :)

Nahoru Odpovědět 27.10.2014 22:05
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
švrčajs
Člen
Avatar
Odpovídá na Hit
švrčajs:

Díky ;)...
No, napsal mi nejdříve toto: Pro vytvareni retezcu v metode formatStr byste mel pouzit StringBuilder. A následně, že si máme zkusit vytvořit metodu na opakování znaků, která vytvoří řetězec.. Nejdříve pomocí string a += char a pak pomocí toho stringbuilder. Změřit rychlost obou metod a vzít si morální ponaučení :D

 
Nahoru Odpovědět 27.10.2014 22:15
Avatar
švrčajs
Člen
Avatar
švrčajs:

tady mám ty metody na otestování rychlosti :D a docela velký rozdíl to hází, při používání StringBuilderu

public class Main {
        public static  String repeatChar1(char c, int n){
                long x = System.currentTimeMillis();
                String s = "";
                for (int i = 0; i < n; i++){
                        s += c;
                }

                x = (x - System.currentTimeMillis()) * -1;
                System.out.println("Cas v ms: " + x);
                return s;
        }

        public static  String repeatChar2(char c, int n){
                long x = System.currentTimeMillis();

                StringBuilder s = new StringBuilder(n);
                for (int i = 0; i < n; i++){
                        s.append(c);
                }

                x = (x - System.currentTimeMillis()) * -1;
                System.out.println("Cas v ms: " + x);
                return s.toString();
        }

        public static void main(String[] args) {
                System.out.println("Vytvoreni strignu");
                repeatChar1('a', 100000);
                repeatChar2('a', 100000);
        }
 
Nahoru Odpovědět  +1 28.10.2014 17:44
Avatar
Hit
Člen
Avatar
Odpovídá na švrčajs
Hit:

Nice, zase se cítím o něco chytřejší :D

Editováno 28.10.2014 18:15
Nahoru Odpovědět 28.10.2014 18:14
Life's not about how hard you can hit, it's about how hard you can GET hit and keep moving forward.
Avatar
švrčajs
Člen
Avatar
švrčajs:

Abych zbytečně nezakládal nové téma :D Dostal jsem úkol naprogramovat metodu Filter(z jazyka scheme, popř lisp) a aplikovat ji s anonymní třídou, lambdou a vnořenou třídou .. Jestli jsem to správně pochopil tak anonymní třídu a lambdu mám, ale nevím si rady s tou vnořenou třídou viz kod

System.out.println("Filter pomocí anonymní třídy:");
                List<Object> lst2 = new ArrayList<Object>();
                lst2.add(1);
                lst2.add(2);
                lst2.add(3);
                lst2.add(4);
                lst2.add(5);
                lst2.add(6);
                lst2.add(7);
                lst2.add(8);
                lst2.add(9);
                lst2.add(10);
                List<Object> lst3 =
                FunkceFilter.filter(lst2, new Condition(){
                        //anon. třída
                        public boolean condition(Object o){
                                return (Integer) o % 2 == 0;
                        }

                });
                for(Object o : lst3){
                        System.out.println(o);
                }
                System.out.println("Filter pomocí lambdy:");
                //lambda
                lst3 = FunkceFilter.filter(lst2, (a) -> ((int) a % 2 == 0));
                for(Object o : lst3){
                        System.out.println(o);
                }
                System.out.println("Filter pomocí vnitřní třídy:");
                lst3 = FunkceFilter.filter(lst2, c); // zde by se mělo nahradit c vnitřní třídou

Nevíte někdo, jak by to mělo vypadat ?

 
Nahoru Odpovědět 29.10.2014 16:14
Avatar
Hartrik
Redaktor
Avatar
Odpovídá na švrčajs
Hartrik:

Možná nějak takto:

// ... uvnitř nějaké třídy

class MyInnerCondition extends Condition {
    public boolean condition(Object o) {
        return (int) o % 2 == 0;
    }
}

void test() {
    FunkceFilter.filter(list, new MyInnerCondition())
}
Editováno 29.10.2014 17:21
 
Nahoru Odpovědět  +1 29.10.2014 17:20
Avatar
švrčajs
Člen
Avatar
Odpovídá na Hartrik
švrčajs:

Ajo, že mě to netrklo :D... Díky

 
Nahoru Odpovědět 29.10.2014 17:30
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 17 zpráv z 17.