IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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: Format stringu

Aktivity
Avatar
švrčajs
Člen
Avatar
švrčajs:22.10.2014 15:56

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:22.10.2014 15:59
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
Tvůrce
Avatar
Odpovídá na švrčajs
tomisoka:22.10.2014 16:19

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:22.10.2014 17:47

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:22.10.2014 17:48

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:22.10.2014 17:48

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:22.10.2014 17:53

Nevadí :D i tak dík ;)

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

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:27.10.2014 21:54

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 Hartinger
Vlastník
Avatar
Odpovídá na švrčajs
David Hartinger:27.10.2014 21:59

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
New kid back on the block with a R.I.P
Avatar
Hit
Člen
Avatar
Odpovídá na David Hartinger
Hit:27.10.2014 22:05

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:27.10.2014 22:15

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:28.10.2014 17:44

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
28.10.2014 17:44
Avatar
Hit
Člen
Avatar
Odpovídá na švrčajs
Hit:28.10.2014 18:14

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:29.10.2014 16:14

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
Tvůrce
Avatar
Odpovídá na švrčajs
Hartrik:29.10.2014 17:20

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
29.10.2014 17:20
Avatar
švrčajs
Člen
Avatar
Odpovídá na Hartrik
švrčajs:29.10.2014 17:30

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.