Reputation: 344
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
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