Diskuze: Format stringu
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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.
Můžeš použít ArrayList<Character> a pak to převést zpátky do Stringu
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;
}
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;
}
Nikdy jsem s tím nepracoval, takže nevím jestli to používám správně,
ale funguje to . 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();
}
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.
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í
tady mám ty metody na otestování rychlosti 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);
}
Nice, zase se cítím o něco chytřejší
Abych zbytečně nezakládal nové téma 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 ?
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())
}
Zobrazeno 17 zpráv z 17.