NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Porovnání dvou polí

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

Aktivity
Avatar
Fondzee
Člen
Avatar
Fondzee:18.1.2018 11:31

Ahoj,

potřeboval bych radu jak by jste řešili následující "problém".

Mějme dvě pole:

String[] stylesForFind = {".main", "#selection"};
String[] allStyles= {".main { background: #fff; }", "#selection{ font-size:1em; }"," .main-footer{ width: 100%; } "};

(výsledek by měl být:".main { background: #fff; } #selection{ font-size:1em; }" )

Mohl bych vzít záznam z stylesForFind a nějakým regulárním výrazem ho hledat v allStyles.

Regulární výraz by ale musel počítat se záznamem viz. třetí záznam v poli allStyles a nevím zda by to bylo spolehlivé... (zda bych dokázal ošetřit všechny možné stavy)

napadá vás jak něco podobného efektivně řešit ?

díky za jakýkoliv nápad.

 
Odpovědět
18.1.2018 11:31
Avatar
Odpovídá na Fondzee
Matúš Olejník:18.1.2018 12:12

Dá sa predpokladať že za položkou zo stylesForFind napr teda ".main" pôjde množinová zátvorka alebo medzera (čiže ".main " alebo ".main{")?

Nahoru Odpovědět
18.1.2018 12:12
/* I am not sure why this works but it fixes the problem */
Avatar
Fondzee
Člen
Avatar
Odpovídá na Matúš Olejník
Fondzee:18.1.2018 12:14

ne zde bude vždy jen buď .main nebo v případě id #main nikdy by se tam nemělo dostat nic jiného (bez mezer nebo jiných znaků)

Editováno 18.1.2018 12:14
 
Nahoru Odpovědět
18.1.2018 12:14
Avatar
Odpovídá na Fondzee
Matúš Olejník:18.1.2018 12:17

Sorry zabudol som dopísať, som myslel že ak zo stylesForFind zoberem položku .main tak v allStyles bude treba nájsť také .main za ktorým ide množinová zátvorka či nie? Ak hej tak len z allStyles vyhodíš všetky medzery a budeš hľadať položky stylesForFind[i] + "{"

Nahoru Odpovědět
18.1.2018 12:17
/* I am not sure why this works but it fixes the problem */
Avatar
Fondzee
Člen
Avatar
Fondzee:18.1.2018 12:36

To by v idenim pripade fungovalo ale v allstyles bude dost pravdeposobne záznam typu: .main .header:hover {} a spoustu jiných možností... prostě nebude vždy jen jedna class ... viz třeba css bootstrapu

 
Nahoru Odpovědět
18.1.2018 12:36
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:18.1.2018 13:45

Nevím, ale myslím, že na takovýto druh příkladu by se ideálně hodila databáze nebo dobře nastylizovat .property file případně nějaké XMLko. Každopádně takto by ses za chvíli mohl dostat do situace, kdy místo obecného pole vytvoříš dvě naprosto specifické instance polí a už to nebude objektové. Tuším že děláš nějakou apku, kde budeš mít možnost vybrat styl z nějakého listu, ale kór když je to takhle specifické, tak bych to řešil spíš přes MySQL, to je v těchto případech mocnější. Java by to sice dokázala, ale musel bys fakt přemýšlet nad sebemenší odlišností, která by mohla nastat.

Nahoru Odpovědět
18.1.2018 13:45
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Fondzee
Člen
Avatar
Odpovídá na Lubor Pešek
Fondzee:18.1.2018 13:54

No to je otázka ...
Ve zkratce jde o app které řeknu chci tenhle prvek (tím se rozumí nějaký blok html kodu)
Z kterého já vezmu všechny css třídy a id které pak vyhledam v stylech dané stránky

Takže teď mám všechny třídy které chci
A mám celé css dane stránky

Výsledek by měl být jen css pro prvek který hledám to k tomu co by to mělo být za app
Snad je to alespoň trochu srozumitelné

Nicméně rád mých si poradil s javou než to cpát do db tam bych mimochodem řešil asi podobný problém nicméně dik za názor popremyslim o tom ...

Ad omlouvám se za občasnou diakritiku jsem na mobilu

 
Nahoru Odpovědět
18.1.2018 13:54
Avatar
Neználek
Člen
Avatar
Odpovídá na Fondzee
Neználek:18.1.2018 21:10

Myslím, že jádro problému je v tom, že řetězcová reprezentace

String[] allStyles= {".main { background: #fff; }", "#selection{ font-size:1em; }"," .main-footer{ width: 100%; } "};

není pro tvoji úlohu příliš vhodná.

Předpokládám, že už teď máš funkční kód, který z CSS souboru vytvoří pole allStyles.
Zkusil bych jít ještě dál a napsat něco, co bude vracet nějakou složitější strukturu.

Syntaxe CSS je popsána např. zde:
https://www.w3.org/…ss-syntax-3/

Pokud nechceš psát vlastní CSS parser, můžeš zkusit použít nějakou knihovnu, např.
CSS Parser
http://cssparser.sourceforge.net/

 
Nahoru Odpovědět
18.1.2018 21:10
Avatar
Fondzee
Člen
Avatar
Odpovídá na Neználek
Fondzee:18.1.2018 21:21

Ahoj díky za reakci ... pole allstyles je pole vytvořené pomocí knihovny cssparser kterou zminujes... možná jsem nečetl dost pozorně dokumentaci ale nepodařilo se mi zjistit jak pomoci ní ne jen vytvořit pole z css stylu ale i v něm nějakým způsobem vyhledávat ... očekával bych něco jako .getClassName(strin­g)
Nebo něco takového ale prostě se mi to nepodařilo v dokumentaci najít...

Jestli s knihovnou máš nějaké zkušenosti budu rád když mě vyvedes z omylu ☺

 
Nahoru Odpovědět
18.1.2018 21:21
Avatar
Neználek
Člen
Avatar
Odpovídá na Fondzee
Neználek:18.1.2018 22:38

Vyhledávání knihovna nepodporuje, ale k selektorům se dá dostat takto:

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

import org.junit.Test;
import org.w3c.css.sac.InputSource;
import org.w3c.css.sac.Selector;
import org.w3c.css.sac.SelectorList;
import org.w3c.dom.css.CSSRule;
import org.w3c.dom.css.CSSRuleList;
import org.w3c.dom.css.CSSStyleSheet;

import com.steadystate.css.dom.CSSStyleRuleImpl;
import com.steadystate.css.parser.CSSOMParser;
import com.steadystate.css.parser.SACParserCSS3;

public class CssParserTest {

    @Test
    public void test() throws IOException {
        InputStream in = getClass().getResourceAsStream("bootstrap.css");
        InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
        InputSource source = new InputSource(reader);
        CSSOMParser parser = new CSSOMParser(new SACParserCSS3());
        CSSStyleSheet sheet = parser.parseStyleSheet(source, null, null);
        CSSRuleList rules = sheet.getCssRules();
        for (int ruleIndex = 0; ruleIndex < rules.getLength(); ruleIndex++) {
            CSSRule rule = rules.item(ruleIndex);
            if (rule.getType() == CSSRule.STYLE_RULE) {
                CSSStyleRuleImpl styleRule = (CSSStyleRuleImpl) rule;
                SelectorList selectors = styleRule.getSelectors();
                for (int selectorIndex = 0; selectorIndex < selectors.getLength(); selectorIndex++) {
                    Selector selector = selectors.item(selectorIndex);
                    System.out.println(selector);
                    System.out.println(styleRule.getStyle().getCssText());
                    System.out.println();
                }
            }

        }
    }

}

Představoval jsem si to tak, že bych selektory vložil do nějaké datové struktury a vyhledával v ní.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
18.1.2018 22:38
Avatar
Fondzee
Člen
Avatar
Odpovídá na Neználek
Fondzee:19.1.2018 11:12

to vypadá dobře ! díky.

otestuji to a dám vědět.

 
Nahoru Odpovědět
19.1.2018 11:12
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 11 zpráv z 11.