Java Stringből Integer eredmény

Címkék
Java Stringből Integer eredmény
2022-10-25T17:12:09+02:00
2022-10-28T12:09:10+02:00
2022-11-23T13:04:06+01:00
gepElek
Sziasztok! 
Egy olyan problémába ütköztem, hogy egy ilyen Stringet "2+2" kellene integerré alakítani. És a végeredmény 4 legyen.
Egy számológép alkalmazás készítéséhez kellene.

Lehet több szám is az Stringben pl. 
"5+9-3*12" 

A vegeredmény kellene ennek a számnak de nem tudom, hogyan számoljam ki.
Integer.parseInt nem mukodik
Integer.valueOf se mukodik

Előre is köszönöm a segítséget!
Mutasd a teljes hozzászólást!
Ilyent nem tud beépítve a Java.

Három opciód van:
* Felhasználod a beépített JavaScript engine-t. (Elvileg JDK 1.6-tól elérhető, én még nem próbáltam ki soha.) Erről lebeszélnélek, mert egyrészt egy hatalmas biztonsági rést nyitsz vele, másrészt ágyuval verébre. Itt találsz bővebb infót.
* Keresel egy előre megírt komponenst, ami majd megcsinálja neked. Például ezt.
* Megírod magadnak.

Ha jól sejtem, ez valami gyakorló feladat, úgyhogy az utóbbi módszer lenne a célravezető.
Ilyen kifejezéseket a legegyszerűbb először lengyelformára hozni, aztán elvégezni.

A lengyelformára hozásról és a kiértékelésről itt találsz egy magyar nyelvű leírást.
Mutasd a teljes hozzászólást!

  • JVM-ben van szállíott JavaScript engine.

    ScriptEngine engine = new ScriptEngineManager().getEngineByName("js")
    Bindings bindings = engine.createBindings();
    ...
    engine.eval("...", binding)
    Mutasd a teljes hozzászólást!
  • Hát ezt bizony nem fogja magától tudni a nyelv, le kell kódolni. Pl.
    1) karakterenként beolvasod
    2) a több egymás mellett lévő "szám" karaktert összevonod integerré
    3) az egészet átírod RPN-re (amire van Java implementáció pl. itt)
    4) végigmész rajta szépen és végrehajtod az utasításokat a végeredményhez.

    Nyilván érdemes valamiféle hibakezelés is. Utána viszont szabadon bővíthető esetleg tizedespont/tizedesvessző kezelésével, új műveletekkel, stb.
    Mutasd a teljes hozzászólást!
  • Az csalás
    Mutasd a teljes hozzászólást!
  • És ez hogyan néz ki js-ben? Addig megvagyok, hogy van egy Stringem ?
    Mutasd a teljes hozzászólást!
  • Ez valami házi feladat vagy magadnak találtad ki és nem bírsz vele?
    Mutasd a teljes hozzászólást!
  • Magamnak. De már kezdem feladni
    Mutasd a teljes hozzászólást!
  • Ne add fel, inkább egyszerűsítsd le! Ha lengyelformában vagy fordított lengyelformában kéred be a kifejezést, sokkal egyszerűbb a végeredményt kiszámolni. Aztán már lehet bonyolítani a szokásos infix formával, zárójelekkel, precedencia figyelembe vételével stb.
    Mutasd a teljes hozzászólást!
  • És ANTLR használat is csalás?
    Nyelv definiálás, tokenizálás, AST (abstract syntax tree) generálás és feldolgozás.
    Mutasd a teljes hozzászólást!
  • Ez tipikusan az a feladat, aminek lehet viszonylag egyszerű a megoldása, vagy a végtelenségig el lehet bonyolítani. Attól függ, hogy mennyire bonyolult matematikai képletet kell a String-ből átkonvertálni számolható formátumba. Akárhogy is van, a lényeg, hogy itt kell írni egy saját String értelmező engine-t, amely képes az operátorokat és az operandusokat átkonvertálni egy egységes, már számolható formulára. A témaindításban azt látom, hogy itt csak egész számokról van szó, amelyek között a négy alapművelet foglalhat helyet. Ez mondjuk úgy, hogy még az "egyszerűbb" eset, de ha már összetetebb matematikai műveleteket is le kell tudni írni, és azokat értelmezni, na az már lehet akár egy kőkemény engine megírása is. De most maradjunk egyenlőre a fenti, egyszerűbb esetnél.

    Most leírom, hogy elméletben hogyan kezdenék neki, de a gyakorlatban biztos lenne olyan, amire nem gondoltam, de kb. így nézne ki.
    A lényeg, hogy a String-et valamilyen beviteli metodika után fel kell írni, egy olyan formában, amely egységesen feldolgozható a program számára.
    1. Első körben javaslom, hogy az operátorokat és az operandusok közé a program automatikusan egy olyan karaktert szúrjon be, amely nem szereplehet a matematikai kifejezésben, és ez mellett a feldolgozás első lépésekén a választott karakter mentén szét lehet split-elni magát a String-et.

    2. A split után már az Array-ban meglennének a konkrét elemek. Ezeken végigmennék, és Integer.parseInt-el megpróbálnám try-catch blokkban felparsonlni. Ha sikerül, akkor nyilván számról van szó, ha nem, akkor a catch ágban ezt lekezelve oprtátorrol, és minden egyes ilyen parse után az egyes elemeket egy megfelelő, de már saját típusos listában tárolnám. A végén fel kell, hogy álljon két lista, amelyben az elemek rendre egymást követi, nyilván az első elem a numerikus listából jön, utána pedig az operátorokat tartalmazó char (vagy String) listából. Ezeken végig menve, és az operátorokat megfelelően értelmezve már felépíthető a matematikai képlet, és számolható, amelyből kijön a végeredmény.

    Kb. így indulhatna, röviden, tömören leírva, de ahogy fentebb leírtam, lehetnek benne még olyan buktatók, amelyekre itt most elméletben még nem gondoltam. De kiindulásnak talán jó. ha lesz időm, talán még meg nézem, hogy mennyire működőképes. :)
    Mutasd a teljes hozzászólást!
  • Szerintem nem kell feladni, csak az van hogy egy nehéz feladatot választottál. Ha magadnak akarod megírni, akkor kell hozzá jó pár dolog. Fordított Lengyel-forma, szöveg feldolgozás, stb.

    Ilyen bonyolultságú feladatokat állásinterjúkon, meg egyetemi ZH beugrókon szoktak kérni. 

    A másik lehetöség, hogy nem magadnak írod meg, hanem használsz valami eszközt ami tud ilyen müveleteket kiértékelni. Ebben az esetben meg azt kell tudni, hogy egy Java projekt hogy épül fel és hogyan tudsz külsö eszközöket, library -ket, modulokat hozzáadni.

    Szóval bármelyik utat választod, sokat lehet belöle tanulni.

    Ha könnyen-gyorsan akarod megoldani, komoly tanulás nélkül, akkor azt érdemes végiggondolni, hogy a Java jó választás e erre. Pl. JavaScript -ben valószínüleg egyszerübb.
    Mutasd a teljes hozzászólást!
  • JavaScript -ben valószínüleg egyszerübb

    Valószínűleg
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • const calculator = p => Function(`return ${p}`)();



    Ez egy fokkal jobb mint a sima eval, érdemes a paramétert még lecsekkolni regexp-el, hogy csak a megfelelő karakterek legyenek benne.
    Mutasd a teljes hozzászólást!
  • Az eval - vagy más - függvény használata még nem segíti a probléma megoldó képesség fejlesztését. Valójában itt éppen az lenne a feladat, hogy implementálásra kerüljön - bármilyen programozási platformon - a js eval, vagy ehhez hasonló fv. műkődése. (Vagy valami olyané, ami hasonlót tud.) Ugyanis a háttérben az eval sem csinált mást, mint értelmez egy String-et (token-re bont, matematikai képletet épít fel belöle, elvégzi a műveleteket, stb.). A lényeg itt a hogyan-on van, nem pedig a konkrét feladat megvalóstása egy kézhez kapott fv. alkalmazásával.
    Mutasd a teljes hozzászólást!
  • Ezért írtam a hozzászólást a legelején, amiben lépésenként összeszedtem, hogy mit kell csinálni. Ugyanezért mondtam E_Pluribus_Unum megoldására, hogy csalás. Olvasol is, vagy csak írsz?
    Mutasd a teljes hozzászólást!
  • Már majdnem megvan, viszont most valami más a probléma. Sikerült átalakítani lengyel alakká viszont ilyet még nem láttam: 
    Main: 

    String[] s = {"5", "2", "+"}; //Ezzel működik

            String expression = "5+2";
            String infixForma = infixToRpn(expression);

            String arr[] = explode(infixForma);  //Ezzel nem

            for (String arr1 : arr) {
                System.out.println(arr1);
            }
            System.out.println("");
            for (String item : s) {  
                System.out.println(item);
            }
    //Ugyanazokat az elemeket tartalmazzák csak az arr tömbben a "+" jelet valamiért karakternek látja
            int result = stacky(s); //Ez működik
    int result2 = stacky(arr);//Ez nem
            System.out.println(result);




    Az első "s" String arrayel működik minden, ki is számolja. Viszont ha átalakítom az expressiont "5+2" hogy szedje szét a karaktereit egy String tömbbe nos még az is megvan, hiszen át  tudta alakítani viszont valamiért a String tömbben lévő "+" jelet szerintem egy karakterként érzékeli, de nem értem hogyan, ha egy String tömbben van és az első "s" tömbnél működk. 
    NumberFormatExceptiont ír amikor int result = stacky(arr); -t lefuttatom és a stacky metódusban be se lép a + jel résznél viszont az "s" array- nél pedig belép. Így a + jelet is át akarja alakítani Integerré viszont azt nem kéne. Erre van valami ötletetek?

    Az inifoxforma egy ilyen String: 52+;

    Kód: 

      public static String[] explode(String s) {
            String[] arr = new String[s.length()];
            for (int i = 0; i < s.length(); i++) {
                arr = String.valueOf(s.charAt(i));
            }
            return arr;
        }

        public static int stacky(String[] tokens) {

            // Initialize the stack and the variable
            Stack<String> stack = new Stack<String>();
            int x, y;
            String result = "";
            int get = 0;
            String choice;
            int value = 0;
            String p = "";

            // Iterating to the each character
            // in the array of the string
            for (int i = 0; i < tokens.length; i++) {

                // If the character is not the special character
                // ('+', '-' ,'*' , '/')
                // then push the character to the stack
                if (tokens != "+" && tokens != "-"
                        && tokens != "*" && tokens != "/") {
                    stack.push(tokens);
                    continue;
                } else {
                    // else if the character is the special
                    // character then use the switch method to
                    // perform the action
                    choice = tokens;
                }

                // Switch-Case
                switch (choice) {
                    case "+":

                        // Performing the "+" operation by poping
                        // put the first two character
                        // and then again store back to the stack
                        x = Integer.parseInt(stack.pop());
                        y = Integer.parseInt(stack.pop());
                        value = x + y;
                        result = p + value;
                        stack.push(result);
                        break;

                    case "-":

                        // Performing the "-" operation by poping
                        // put the first two character
                        // and then again store back to the stack
                        x = Integer.parseInt(stack.pop());
                        y = Integer.parseInt(stack.pop());
                        value = y - x;
                        result = p + value;
                        stack.push(result);
                        break;

                    case "*":

                        // Performing the "*" operation
                        // by poping put the first two character
                        // and then again store back to the stack
                        x = Integer.parseInt(stack.pop());
                        y = Integer.parseInt(stack.pop());
                        value = x * y;
                        result = p + value;
                        stack.push(result);
                        break;

                    case "/":

                        // Performing the "/" operation by poping
                        // put the first two character
                        // and then again store back to the stack
                        x = Integer.parseInt(stack.pop());
                        y = Integer.parseInt(stack.pop());
                        value = y / x;
                        result = p + value;
                        stack.push(result);
                        break;

                    default:
                        continue;
                }
            }

            // Method to convert the String to integer
            return Integer.parseInt(stack.pop());
        }


    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Erre gondoltam, igen. :D
    Mutasd a teljes hozzászólást!
  • Ilyent nem tud beépítve a Java.

    Három opciód van:
    * Felhasználod a beépített JavaScript engine-t. (Elvileg JDK 1.6-tól elérhető, én még nem próbáltam ki soha.) Erről lebeszélnélek, mert egyrészt egy hatalmas biztonsági rést nyitsz vele, másrészt ágyuval verébre. Itt találsz bővebb infót.
    * Keresel egy előre megírt komponenst, ami majd megcsinálja neked. Például ezt.
    * Megírod magadnak.

    Ha jól sejtem, ez valami gyakorló feladat, úgyhogy az utóbbi módszer lenne a célravezető.
    Ilyen kifejezéseket a legegyszerűbb először lengyelformára hozni, aztán elvégezni.

    A lengyelformára hozásról és a kiértékelésről itt találsz egy magyar nyelvű leírást.
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd