Zi1mann
Zi1mann

Reputation: 344

Multiply values from mixed Arrays

I've got a String[] formelHolder in which there are Strings ("words" and numbers like H2O) from an UI source (input here). For each of the "words" I get an value from a database which is added into the double[] massHolder [double[]]. Now I want to multiply the doubles in massHolder[k-1] with the numbers from the formelHolder[k] so for example, the value from H in massHolder will be multiplied with the 2 from formelHolder. I've tried this so far:

btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double masse = 0.0;
            String formel = textFieldFormel.getText();
            String[] formelHolder = formel.split("(?=[A-Z0-9])");
            double[] massHolder = new double[formelHolder.length];

            for (int i = 0; i < formelHolder.length; i++){
                System.out.println("formelHolder[i]: i="+i+ formelHolder[i]);
                if (formelHolder[i].equals("2")){
                } else {
                    massHolder[i] = Double.parseDouble(dbhandler.getMass(formelHolder[i]));
                    System.out.println("i: "+ i+ " FormelHolder: "+formelHolder[i] +" Masse: "+massHolder[i]);

                    for (int k = 0; k<formelHolder.length; k++){
                        if (formelHolder[k].equals("2")){
                            masse = masse + massHolder[k-1]*Double.parseDouble(formelHolder[k]);
                        } else { 
                            masse = masse + massHolder[k];
                        }
                    }
                    System.out.println("Finally: "+masse);


                }
            }
        }
    });

resulting in, for example in the case of HH2 with massHolder for H = 1.01 ---> abc = 4.04 instead of abc = 3.03

Content of formelHolder will be (for the example HH2 which should result in 3.03 instead of 4.04):

formelHolder[1] = H
formelHolder[2] = H
formelHolder[3] = 2

massHolder[1] = 1.01
massHolder[2] = 1.01
massHolder[3] -> empty [due to being a number in formelHolder]

Current code is, as given in your awnser:

for (int k = 0; k<formelHolder.length-1; k++){
                        if (formelHolder[k].matches("\\d+(.\\d+)?")){
                            double masseHolder = Double.parseDouble(formelHolder[k]);
                            masse += massHolder[k-1]*(masseHolder-1);
                        } else { 
                            masse += massHolder[k];
                        }
                    }

Upvotes: 0

Views: 86

Answers (1)

laune
laune

Reputation: 31290

This should work, but see below.

double abc = 0.0;
for (int k = 0; k < formelHolder.length - 1; k++){

   if (formelHolder[k].matches("\\d+(\\.\\d+)?")){
      double f = Double.parseDouble(formelHolder[k]);
      abc += massHolder[k-1]*(f-1);
   } else {
      abc += massHolder[k];
   }
}

I simply add the numeric values for all non-numeric entries. For a numeric entry, I convert the factor subtract one (!) and multiply with the numeric value at the preceding index.

This assumes that the two arrays are used in parallel. If massHolder does not contain fillers (null or 0) for numeric values in formelHolder, the index values for formelHolder must be carried in another variable and incremented explicitly whenever a value is taken from that array.

There are a few possible hiccups.

sArray = new formelHolder[]{ "22", ... }

First entry may not be numeric.

sArray = new formelHolder[]{ "H", "3", "2",...}

There may not be two numbers in a row.

Edit Merged with OP's code

public static void compute( String formula, double[] values ){
    double masse = 0.0;
    String[] formulaHolder = formula.split("(?=[A-Z0-9])");
    double[] massHolder = new double[formulaHolder.length];

    for (int k = 0; k < formulaHolder.length; k++){
        String form = formulaHolder[k];
        if (form.matches("\\d+")){
            double f = Double.parseDouble(form);
             masse += massHolder[k-1]*(f-1);
        } else {
             massHolder[k] = values[k]; // get the value from the db
             masse += massHolder[k];
        }
    }
    System.out.println( masse );
}

Upvotes: 1

Related Questions