Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    47

    Convertire espressione letterale in numerica dai valori di una mappa

    Salve a tutti posto qui di seguito un programma semplificato del mio problema.
    Data una stringa contenente un'espressione matematica letterale voglio ottenere la stessa espressione convertendo le lettere in numeri prendendo i valori da una mappa.
    Vi posto qui di seguito il mio codice sperando in un vostro aiuto
    codice:
    public class Prova {
    	 public static void main(String[] argv)
    
    
    	    {
    		 //espressione matematica
    		 String expr = "(a*b)+(b/a)";  //(15*60)+(60/15)
    		 //mappa dei valori numerici
    		 HashMap<String, Double> itemval = new HashMap();
    		 
    		 //popolo la mappa
    		 itemval.put("a", 15.0);
    		 itemval.put("b", 60.0);
    		 
    		 //stampo per verificare i valori
    		 System.out.println("itemval: "+itemval);
    		 System.out.println("expr: " + expr);
    		 
    		 //converto espressione letteraria in numerica
    		 char[] nc = expr.toCharArray();
    		 for (int t = 0; t < nc.length; t++) {
    			 char pippo = nc[t];
    			 for (String key: itemval.keySet()){
    				 if (key.equals(pippo)){
    					 System.out.println("pippo: "+itemval.get(key));
    				 }
    			 }
    				System.out.print(nc[t]);
    		 }
    		 
    	    }
    }
    quello che voglio è ottenere un output del tipo (15*60)+(60/15)
    Grazie in anticipo a chi mi aiuterà in questo problema.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da main_001 Visualizza il messaggio
    Salve a tutti posto qui di seguito un programma semplificato del mio problema.
    Data una stringa contenente un'espressione matematica letterale voglio ottenere la stessa espressione convertendo le lettere in numeri prendendo i valori da una mappa.
    quello che voglio è ottenere un output del tipo (15*60)+(60/15)
    No, quel doppio for è già complicato e non è neanche generalizzato.
    Ti conviene usare le "espressioni regolari" (se non hai limiti/restrizioni a riguardo per qualche motivo).
    Crei un Pattern in cui la espressione descrive "una sequenza di una o più lettere" e poi con Matcher vai ad usare i find/appendReplacement/appendTail usando anche un StringBuffer.


    Guarda questo mio vecchio post. Era per tutta un'altra cosa ma è molto molto simile a quanto dovresti fare tu. Se comprendi quell'esempio che avevo fatto ... capisci come farlo.
    Ultima modifica di andbin; 20-06-2016 a 17:41
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    47
    No purtroppo questa è una semplificazione di un problema grande ho bisogno di una conversione così nello specifico per come l'avevo indicata

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da main_001 Visualizza il messaggio
    No purtroppo questa è una semplificazione di un problema grande ho bisogno di una conversione così nello specifico per come l'avevo indicata
    Infatti lo temevo ... quello che ti ho indicato io servirebbe solo per convertire una stringa es. "(a*b)+(b/a)" in un'altra stringa dove le lettere (parole in generale) sono solo "espanse" nei valori numerici mappati es. "(15*60)+(60/15)".
    (non sapevo dove volevi arrivare effettivamente)

    Ma tutto questo NON "valuta" matematicamente la espressione. Per valutare il risultato finale di una espressione matematica di quel tipo, considerando operatori vari (+, - ecc...), priorità tra operatori e raggruppamenti con ( ), serve un "math expression parser" che è abbastanza complesso e farlo da zero richiederebbe 50 volte (se non di più ...) di più del codice che ti ho indicato io.
    Ultima modifica di andbin; 20-06-2016 a 18:12
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    47
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Infatti lo temevo ... quello che ti ho indicato io servirebbe solo per convertire una stringa es. "(a*b)+(b/a)" in un'altra stringa dove le lettere sono solo "espanse" nei valori numerici mappati es. "(15*60)+(60/15)".
    (non sapevo dove volevi arrivare effettivamente)

    Ma tutto questo NON "valuta" matematicamente la espressione. Per valutare il risultato finale di una espressione matematica di quel tipo, considerando operatori vari (+, - ecc...), priorità tra operatori e raggruppamenti con ( ), serve un "math expression parser" che è abbastanza complesso e farlo da zero richiederebbe 50 volte (se non di più ...) del codice che ti ho indicato io.
    infatti la mia idea successiva è utilizzare una classe a parte per il calcolo delle espressioni. Grazie di tutto lo stesso

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    47
    Se dovesse servire a qualcuno ecco come ho risolto:
    codice:
     for (Map.Entry<String, Double> e : itemval.entrySet()) {
                expr = expr.replaceAll(e.getKey(), String.valueOf(e.getValue()));
            }

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Non è buonissimo e usa comunque le "espressioni regolari" (è il replaceAll) ma se la stringa è corta e ci sono una manciata di chiavi che sono solo lettere, non c'è problema. Deduco (credo ..) anche che non hai compreso quel vecchio post che ho citato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.