OSDN Git Service

修正・変更
[chemicraft/chemicraft.git] / common / pcc / chemicraft / util / Formula.java
1 package pcc.chemicraft.util;
2
3 import java.util.ArrayList;
4
5 import pcc.chemicraft.ChemiCraftData;
6
7 /**
8  * 化学式から元素と数を取り出してArrayListに格納します。
9  * @author ponkotate
10  */
11 public class Formula {
12
13         private ArrayList<String> atoms = new ArrayList<String>();
14         private ArrayList<Integer> amonts = new ArrayList<Integer>();
15
16         private int magnification;
17
18         private String lastSpell;
19         private int lastIndex;
20
21         public Formula(String par1) {
22                 this.magnification = 1;
23                 this.run(par1);
24         }
25
26         public Formula(String[] par1, Integer[] par2) {
27                 this.setAtoms(par1, par2);
28         }
29
30         public Formula(ArrayList<String> par1, ArrayList<Integer> par2) {
31                 this.atoms = par1;
32                 this.amonts = par2;
33         }
34
35         // 括弧対応はまだ未完成です。 --WIP--
36         public void run(String par1) {
37                 char[] var2 = par1.toCharArray();
38
39                 for (int i = 0; i < var2.length; i++) {
40                         if (var2[i] == '・') {
41                                 if (this.lastSpell != null) {
42                                         setAtom(this.lastSpell, 1);
43                                 }
44                                 setAtoms(new Formula(new String(var2, ++i, var2.length - i)));
45                                 return;
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])));
54                                 } else {
55                                         this.magnification = Integer.valueOf(Character.toString(var2[i]));
56                                 }
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);
62                                         }
63                                         this.lastSpell = Character.toString(var2[i]);
64                                 } else if (Character.isLowerCase(var2[i])) {
65                                         if (this.lastSpell == null) {
66                                                 throw new IllegalArgumentException();
67                                         }
68                                         this.lastSpell = this.lastSpell.concat(Character.toString(var2[i]));
69                                 }
70                                 this.lastIndex = 0;
71                         } else {
72                                 throw new IllegalArgumentException();
73                         }
74                 }
75                 if (this.lastSpell != null) {
76                         setAtom(this.lastSpell, 1);
77                 }
78         }
79
80         public boolean isAtom(String par1) {
81                 for (String var2:ChemiCraftData.ATOMSLIST) {
82                         if (par1.equalsIgnoreCase(var2)) {
83                                 return true;
84                         }
85                 }
86                 return false;
87         }
88
89         public void setAtom(String par1,  int par2) {
90                 if (isAtom(par1)) {
91                         par2 *= this.magnification;
92                         int var3 = this.atoms.indexOf(par1);
93                         if (var3 == -1) {
94                                 this.atoms.add(par1);
95                                 this.amonts.add(par2);
96                         } else {
97                                 this.amonts.set(var3, this.amonts.get(var3) + par2);
98                         }
99                 } else {
100                         throw new IllegalArgumentException();
101                 }
102         }
103
104         public void setAtom(String par1,  char par2) {
105                 setAtom(par1, Integer.valueOf(Character.toString(par2)));
106         }
107
108         public void setAtoms(String[] par1, Integer[] par2) {
109                 setAtoms(par1, par2, 1);
110         }
111         public void setAtoms(String[] par1, Integer[] par2, int par3) {
112                 if (par1.length != par2.length) {
113                         throw new IndexOutOfBoundsException();
114                 }
115                 for (int i = 0; i < par1.length; i++) {
116                         setAtom(par1[i], par2[i] * par3);
117                 }
118         }
119
120         public void setAtoms(Formula par1) {
121                 setAtoms(par1, 1);
122         }
123
124         public void setAtoms(Formula par1, int par2) {
125                 setAtoms(par1.getAtoms(), par1.getAmonts(), par2);
126         }
127
128         public String[] getAtoms() {
129                 return atoms.toArray(new String[atoms.size()]);
130         }
131
132         public Integer[] getAmonts() {
133                 return amonts.toArray(new Integer[amonts.size()]);
134         }
135
136 }