OSDN Git Service

tc
[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         public Formula(String par1) {
17                 this.run(par1);
18         }
19
20         public Formula(String[] par1, Integer[] par2) {
21                 this.setAtoms(par1, par2);
22         }
23
24         public Formula(ArrayList<String> par1, ArrayList<Integer> par2) {
25                 this.atoms = par1;
26                 this.amonts = par2;
27         }
28
29         // 今後ソースの整頓をする予定 -WIP-
30         public void run(String par1) {
31                 char[] var2 = par1.toCharArray(); // par1のchar配列
32                 String var3 = null; // setAtomの第一引数に送る
33                 int var4 = 0; // setAtomの第二引数に送る
34                 int var5 = 1; // 倍率
35                 Formula var6 = null; // Formula格納用
36
37                 for (int i = 0; i < var2.length; i++) {
38                         if (Character.isLetter(var2[i])) {
39                                 if (Character.isUpperCase(var2[i])) {
40                                         if (var4 <= 0) {
41                                                 var4 = 1;
42                                         }
43                                         if (var3 != null) {
44                                                 this.setAtom(var3,  var4 * var5);
45                                         } else if (var6 != null) {
46                                                 this.setAtoms(var6.getAtoms(), var6.getAmonts(), var4 * var5);
47                                                 var6 = null;
48                                         }
49                                         var3 = Character.toString(var2[i]);
50                                 } else {
51                                         var3 = var3.concat(Character.toString(var2[i]));
52                                 }
53                                 var4 = 0;
54                         } else if (Character.isDigit(var2[i])) {
55                                 if (var3 != null || var6 != null) {
56                                         var4 = var4 * 10 + Integer.valueOf(Character.toString(var2[i]));
57                                 } else {
58                                         var5 = Integer.valueOf(Character.toString(var2[i]));
59                                 }
60                         } else if (var2[i] == '・') {
61                                 if (var3 != null) {
62                                         this.setAtom(var3,  var4 * var5);
63                                 } else if (var6 != null) {
64                                         this.setAtoms(var6.getAtoms(), var6.getAmonts(), var4 * var5);
65                                 }
66                                 var3 = null;
67                                 var4 = 0;
68                                 var5 = 1;
69                                 var6 = null;
70                         } else if (var2[i] == '(') {
71                                 if (var3 != null) {
72                                         this.setAtom(var3,  var4 * var5);
73                                         var3 = null;
74                                         var4 = 1;
75                                 }
76                                 int var7 = par1.indexOf(')');
77                                 String var8 = par1.substring(i + 1, var7);
78                                 var6 = new Formula(var8);
79                                 i = var7;
80                         } else {
81                                 throw new IllegalArgumentException();
82                         }
83                 }
84                 if (var3 != null) {
85                         if (var4 <= 0) {
86                                 var4 = 1;
87                         }
88                         this.setAtom(var3,  var4 * var5);
89                 }
90         }
91
92         public boolean isAtom(String par1) {
93                 for (String var2:ChemiCraftData.ATOMSLIST) {
94                         if (par1.equalsIgnoreCase(var2)) {
95                                 return true;
96                         }
97                 }
98                 return false;
99         }
100
101         public void setAtom(String par1,  int par2) {
102                 if (isAtom(par1)) {
103                         int var3 = this.atoms.indexOf(par1);
104                         if (var3 == -1) {
105                                 this.atoms.add(par1);
106                                 this.amonts.add(par2);
107                         } else {
108                                 this.amonts.set(var3, this.amonts.get(var3) + par2);
109                         }
110                 } else {
111                         throw new IllegalArgumentException();
112                 }
113         }
114
115         public void setAtom(String par1,  char par2) {
116                 setAtom(par1, Integer.valueOf(Character.toString(par2)));
117         }
118
119         public void setAtoms(String[] par1, Integer[] par2) {
120                 setAtoms(par1, par2, 1);
121         }
122         public void setAtoms(String[] par1, Integer[] par2, int par3) {
123                 if (par1.length != par2.length) {
124                         throw new IndexOutOfBoundsException();
125                 }
126                 for (int i = 0; i < par1.length; i++) {
127                         this.setAtom(par1[i], par2[i] * par3);
128                 }
129         }
130
131         public String[] getAtoms() {
132                 return atoms.toArray(new String[atoms.size()]);
133         }
134
135         public Integer[] getAmonts() {
136                 return amonts.toArray(new Integer[amonts.size()]);
137         }
138
139 }