1 package pcc.chemicraft.util;
3 import java.util.ArrayList;
5 import pcc.chemicraft.ChemiCraftData;
8 * 化学式から元素と数を取り出してArrayListに格納します。
11 public class Formula {
13 private ArrayList<String> atoms = new ArrayList<String>();
14 private ArrayList<Integer> amonts = new ArrayList<Integer>();
16 private int magnification;
18 private String lastSpell;
19 private int lastIndex;
21 public Formula(String par1) {
22 this.magnification = 1;
26 public Formula(String[] par1, Integer[] par2) {
27 this.setAtoms(par1, par2);
30 public Formula(ArrayList<String> par1, ArrayList<Integer> par2) {
35 // 括弧対応はまだ未完成です。 --WIP--
36 public void run(String par1) {
37 char[] var2 = par1.toCharArray();
39 for (int i = 0; i < var2.length; i++) {
41 if (this.lastSpell != null) {
42 setAtom(this.lastSpell, 1);
44 setAtoms(new Formula(new String(var2, ++i, var2.length - i)));
46 } else if (var2[i] == '(') {
47 // 括弧対応はまだ未完成です。 --WIP--
48 } else if (Character.isDigit(var2[i])) {
49 if (this.lastIndex > 0) {
50 this.amonts.set(this.amonts.size() - 1,
51 this.lastIndex = this.lastIndex * 10 + Integer.valueOf(Character.toString(var2[i])));
52 } else if (this.lastSpell != null) {
53 setAtom(this.lastSpell, this.lastIndex = Integer.valueOf(Character.toString(var2[i])));
55 this.magnification = Integer.valueOf(Character.toString(var2[i]));
57 this.lastSpell = null;
58 } else if (Character.isLetter(var2[i])) {
59 if (Character.isUpperCase(var2[i])) {
60 if (this.lastSpell != null) {
61 setAtom(this.lastSpell, 1);
63 this.lastSpell = Character.toString(var2[i]);
64 } else if (Character.isLowerCase(var2[i])) {
65 if (this.lastSpell == null) {
66 throw new IllegalArgumentException();
68 this.lastSpell = this.lastSpell.concat(Character.toString(var2[i]));
72 throw new IllegalArgumentException();
75 if (this.lastSpell != null) {
76 setAtom(this.lastSpell, 1);
80 public boolean isAtom(String par1) {
81 for (String var2:ChemiCraftData.ATOMSLIST) {
82 if (par1.equalsIgnoreCase(var2)) {
89 public void setAtom(String par1, int par2) {
91 par2 *= this.magnification;
92 int var3 = this.atoms.indexOf(par1);
95 this.amonts.add(par2);
97 this.amonts.set(var3, this.amonts.get(var3) + par2);
100 throw new IllegalArgumentException();
104 public void setAtom(String par1, char par2) {
105 setAtom(par1, Integer.valueOf(Character.toString(par2)));
108 public void setAtoms(String[] par1, Integer[] par2) {
109 setAtoms(par1, par2, 1);
111 public void setAtoms(String[] par1, Integer[] par2, int par3) {
112 if (par1.length != par2.length) {
113 throw new IndexOutOfBoundsException();
115 for (int i = 0; i < par1.length; i++) {
116 setAtom(par1[i], par2[i] * par3);
120 public void setAtoms(Formula par1) {
124 public void setAtoms(Formula par1, int par2) {
125 setAtoms(par1.getAtoms(), par1.getAmonts(), par2);
128 public String[] getAtoms() {
129 return atoms.toArray(new String[atoms.size()]);
132 public Integer[] getAmonts() {
133 return amonts.toArray(new Integer[amonts.size()]);