Tak schvalne nedavno jsem dostal za ukol udelat pohovor pro potencialniho kolegu.
Dal jsem mu na papire tohle:
List<String> list = new ArrayList<>();
list.add("fine");
list.add("fine");
list.add("wrong");
list.add("fine");
list.add("fine");
for (String s: list) {
if(s.equals("wrong")){
list.remove(s);
}
}
System.out.println(list.size());
a) Ako prvé som si všimol porovnávanie stringov. Typická školácka chyba, hlavne tých, čo prechádzajú do Javy z iného jazyka. Takto sa to správne nemá robiť, môže dôjsť k
NullPointerException. Správne je
"wrong".equals(s)b) Príklad by som upravil tak, že by som použil novinky z Javy 9 a Javy 10. Vytváranie zoznamov v Jave oproti iným jazykom (Python, Ruby) je totiž jedným z nedostatkov Javy, ktoré najviac udrú do očí. To sa mi nikdy
nepáčilo.
c) Nazvať premennú
list nie je bohviečo. Keď už, tak
myList.
d) Mne nenapadlo, že dôjde k
ConcurrentModificationException.
Takže upravený kód by vyzeral asi takto:
package com.zetcode;
import java.util.ArrayList;
import java.util.List;
public class JavaEx {
public static void main(String[] args) {
// var words = new ArrayList<String>();
var words = List.of("fine", "fine", "wrong", "fine", "fine");
//words.add("fine");
//words.add("fine");
//words.add("wrong");
//words.add("fine");
//words.add("fine");
for (String word: words) {
if (!"wrong".equals(word)) {
System.out.println(word);
}
//if(s.equals("wrong")){
// words.remove(s);
// }
}
System.out.println(words.size());
}
}
Z príkladu nie je jasné, čo sa tam má vlastne vykonať. Nie je tam žiadne konkrétne zadanie.
Otazka znela jestli se mu to libi. A jestli ne, tak co by udelal jinak.
Myslite, ze je to rozumna otazka co dat na pohovoru kolegovi s 10+ lety praxe v C++ a rokem javy?
Mne sa otázka nepozdáva. Nie je dosť presne povedané, čo sa očakáva. Či sa mi to páči je príliš všeobecné
zadanie. Element
"wrong" sa totiž dá odstrániť jednoduchým volaním metódy
remove().
Ak bolo myslené ako vyfiltrovať zoznam, tak tam bolo dať nejakú poznámku a použiť vhodnejšie dáta. Potom sa samozrejme použije funkcionálna Java:
package com.zetcode;
import java.util.List;
import java.util.stream.Collectors;
public class JavaEx2 {
public static void main(String[] args) {
var words = List.of("cloud", "fine", "wrong", "wrongful",
"temper", "wrongdoing", "variance");
var words2 = words.stream().filter(e -> !e.startsWith("wrong"))
.collect(Collectors.toList());
System.out.println(words2);
}
}
Príklad vyfiltruje všetky slová, ktoré sa nezačínajú na
"wrong". Treba povedať jasnejšie, čo sa
očakáva.