2. domácí úkol - FIND

Předmět zaměřený na praktické programování v jazyku a prostředí Java
Uživatelský avatar
Ellrohir
Matfyz(ák|ačka) level III
Příspěvky: 140
Registrován: 21. 12. 2007 13:29
Typ studia: Informatika Bc.
Bydliště: Praha
Kontaktovat uživatele:

2. domácí úkol - FIND

Příspěvek od Ellrohir »

prosím nějakého dobrodince - jak jste řešili hledání pomocí masky? Hnětynka mi mojí (očividně špatnou, to jsem po zpětném pohledu musel uznat) verzi vrátil a ať teď zkouším co zkouším, tak to pokaždý na některej případ nefunguje... :cry:

edit : pokud by někdo nedělal tenhle příklad, ale uměl by třeba poradit - přesné znění je : procházet názvy souborů a porovnávat s maskou, kde "*" znamená libovlný počet jakýchkoliv znaků a "?" libovolný jeden znak...zkoušel jsem to různě převádět na regexpy, ale ty mi bohužel moc nejdou, takže ve výsledku to nikdy nefunguje pořádně :roll:
Uživatelský avatar
Oscar
Donátor
Donátor
Příspěvky: 26
Registrován: 13. 11. 2004 13:52
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Re: 2. domácí úkol - FIND

Příspěvek od Oscar »

zatial som ulohu nerobil, ale myslim si, ze previest * a ? na regexp je iba o pridani bodky pred. Teda regexp ".*" matchuje lubovolny (aj nulovy) pocet lubovolnych znakov (to je ta bodka) a otaznik znamena, ze ten lubovolny znak tam moze alebo nemusi byt. keby si chcel mat ? striktne jeden znak, tak by sa tam mala dat len bodka "." (akoze jeden lubovolny znak). Neviem ale ako tie regexpy funguju v Jave, ale myslim ze by to malo byt rovnako ako ine regexpy.
Vela stastia...
Uživatelský avatar
Ellrohir
Matfyz(ák|ačka) level III
Příspěvky: 140
Registrován: 21. 12. 2007 13:29
Typ studia: Informatika Bc.
Bydliště: Praha
Kontaktovat uživatele:

Re: 2. domácí úkol - FIND

Příspěvek od Ellrohir »

no už jsem to udělal jiným způsobem, ale to, co říkáš podle mě není úplně dobrá cesta...protože bys pak musel nějak ohlídat oescapování všech ostatních potenciálních částí regulárního výrazu v původní masce (třeba kdyby tam bylo "[a-z]"), jinak by je java funkce String.match(String regexp) chtěla zmatchovat taky...aspoň myslím...

každopádně já jsem nakonec udělal tohle řešení, které se zdá být funkční, i když je trochu delší :

Kód: Vybrat vše

public static boolean matcher(String mask, String word) {
        if (mask.length() == 0) // nothing more in mask - means the rest of the word will defintely match
        {
            if (word.length()>0)
                return false; // still some chars in word - no match
            else
                return true; // match of mask and word
        }
        // standard matching
        boolean match = true; // lets presume...
        // check the first char of mask

        if (mask.charAt(0) == '*') {
            // remove this '*' from mask
            // remove letters from word, until matcher calling returns true
            String newWord = word;
            while (!matcher(mask.substring(1), newWord)&&(newWord.length()>0))
            {
                newWord = newWord.substring(1);
            }
            // call function again for new mask and word version
            match = matcher(mask.substring(1), newWord);
        } else if (mask.charAt(0) == '?') {
            if (word.length() > 0) {
                // remove this '?' from mask
                // delete first chsr in word - stands for this '?'
                // call function again for new mask and word version
                match = matcher(mask.substring(1), word.substring(1));
            } else {
                // word is too short so it cannot match
                match = false;
            }
        } else {
            if (word.length() > 0) {
                // match to some sub-string
                // first - get the position of next '*' or '?' in mask
                int bound1 = mask.indexOf('*');
                int bound2 = mask.indexOf('?');
                int bound = -1;
                if ((bound1>-1)&&(bound2>-1))
                {
                    if (bound1<=bound2)
                        bound = bound1;
                    else
                        bound = bound2;
                }
                else
                {
                    if (bound1>-1)
                        bound = bound1;
                    else if (bound2>-1)
                        bound = bound2;
                }
                // now create sub-string we will be matching
                String subMask;
                if (bound > -1) {
                    subMask = mask.substring(0, bound);
                } else {
                    subMask = mask;
                }
                // match with word
                if (word.indexOf(subMask) == 0) {
                    // remove this subMask from mask
                    // delete subMask from word
                    // call function again for new mask and word version
                    match = matcher(mask.substring(subMask.length()), word.substring(word.indexOf(subMask) + subMask.length()));
                } else {
                    // no match
                    match = false;
                }
            } else {
                // word is too short so it cannot match
                match = false;
            }
        }
        // finally return what we get
        return match;
    }
Uživatelský avatar
hippies
Admin(ka) level I
Příspěvky: 990
Registrován: 29. 9. 2004 12:46
Typ studia: Informatika Mgr.
Bydliště: Mladá Boleslav
Kontaktovat uživatele:

Re: 2. domácí úkol - FIND

Příspěvek od hippies »

Oescapovat prece neni zadna prace. Das cyklus pres vsechny znaky a kdyz je nebezpecny, das pred nej \, ([,],.,atd) a pri te prilezitosti udelas tu substituci co popsal Oscar.
Chjo, dovede te si představit svět, kde by byla každá harmonická diferenciální forma (jistého typu) nesingulární projektivní algebraické variety racionální kombinací kohomologických tříd algebraických cyklů..
Uživatelský avatar
Ellrohir
Matfyz(ák|ačka) level III
Příspěvky: 140
Registrován: 21. 12. 2007 13:29
Typ studia: Informatika Bc.
Bydliště: Praha
Kontaktovat uživatele:

Re: 2. domácí úkol - FIND

Příspěvek od Ellrohir »

njn...škoda žes mi to nenapsal dřív, než jsem v potu tváře napsal to svoje :D

když mi tady nikdo neodpovídal, tak jsem se na to ptal na chatu našeho softballovýho klubu "MFF Neratovice" a tam mě jednak ta větší polovina, která jméno "MFF" nosí už dávno jenom proto, že to "dobře zní" vypískala, cože jim to cpu do chatu za nesmysly a ta menší polovina ještě přežívajících skutečných matfyzáků mi poradila ten postup, co jsem uplatnil... :|
Uživatelský avatar
hippies
Admin(ka) level I
Příspěvky: 990
Registrován: 29. 9. 2004 12:46
Typ studia: Informatika Mgr.
Bydliště: Mladá Boleslav
Kontaktovat uživatele:

Re: 2. domácí úkol - FIND

Příspěvek od hippies »

prislo mi to tak banalni, ze jsem myslel, ze v tom bylo neco zaludnejsiho;) (/me a Java nejdou dohromady)

A na rychly odpovedi doporucuju #mff.cuni na irc.quakenet.org
Chjo, dovede te si představit svět, kde by byla každá harmonická diferenciální forma (jistého typu) nesingulární projektivní algebraické variety racionální kombinací kohomologických tříd algebraických cyklů..
Odpovědět

Zpět na „PGR013 Java“