好吧,我正在研究一个读取周期表的程序,你可以根据数字或缩写搜索元素。
无论如何,我试图将周期表文件读入4个不同的数组有点困难:原子序数,缩写,元素名称和原子量。
我不知道如何编写单个方法将所有信息一次性导入每个数组。我希望有一个包含所有这些数组的类,并且我可以在以后需要每个数组时调用它。
这是我到目前为止所得到的,顺便说一句,我有点生疏......我想在这个程序上工作会让我熟悉基础知识。
class PeriodicTable{
private String fileName = "periodictable.dat";
private int[] atomicNumTable = new int[200];
private String[] abbreviationTable = new String[200];
private String[] nameTable = new String[200];
private double[] atomicWeightTable = new double[200];
PeriodicTable(String fileName){
readTable(fileName);
}
public int[] readTable(String fileName){
Scanner inFile = null;
try{
inFile = new Scanner(new File(fileName));
}catch(FileNotFoundException nf){
System.out.println(fileName + " not found");
System.exit(0);
}
atomicNumTable = new int[200];
int i = 0;
while(inFile.hasNext() && i < atomicNumTable.length){
int number = inFile.nextInt();
atomicNumTable[i] = number;
i++;
}
inFile.close();
return atomicNumTable;
}
}
以下是表格的每一行:
1 H Hydrogen 1.00794
答案 0 :(得分:2)
从那里开始工作不应该太难。
但我建议对你的逻辑进行一些修改: 4 不同的表根本没有意义。良好的OO编程是关于创建有用的抽象。如果没有抽象,您的程序将变为抽象本身。
含义:你应该引入类似
的类public class Element {
private final int id;
private final String abbreviation;
private final String fullName;
private final double atomicWeight;
... with one constructor that takes all 4 parameters
... with getter methods for the fields of this class
... and meaningful overrides for equals() and hashcode()
}
然后,而不是创建 4 数组;你创建一个数组,甚至更好ArrayList<Element>
。而不是将4个值推送到4个不同的数组中,而是在每个循环迭代中创建一个新的Element对象;然后将该新对象添加到列表中。
您解决方案的主要区别在于:您可以整体处理元素;而在您的解决方案中,单个“元素”基本上是指向4个不同表的索引。
答案 1 :(得分:2)
您可以大量简化此代码。尝试这样的事情。
1)逐行读取文件,随意分割线条, 将值添加到包含String []
的某个ArrayList2)关闭你的文件
3)将ArrayList转换为String [] []
4)打印结果
另请注意,Java中的数组从0开始索引,而不是从1开始。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
public class Test {
static public void main(String[] args) throws Exception {
File file = new File("periodictable.dat");
FileReader reader = new FileReader(file);
BufferedReader buffReader = new BufferedReader(reader);
String s = null;
ArrayList<String[]> lst = new ArrayList<String[]>();
String[][] res = null;
while((s = buffReader.readLine()) != null){
String[] arr = s.split("[\\s]+");
lst.add(arr);
}
buffReader.close();
res = new String[lst.size()][lst.get(0).length];
res = lst.toArray(res);
System.out.println();
// System.out.println(res);
// String result = Arrays.deepToString(res);
// System.out.println(result);
System.out.println();
for (int i=0; i<res.length; i++){
for (int j=0; j<res[i].length; j++){
System.out.println("res[" + (i+1) + "][" + (j+1) + "]=" + res[i][j]);
}
}
System.out.println();
}
}
<强>输出:强>
res[1][1]=1
res[1][2]=H
res[1][3]=Hydrogen
res[1][4]=1.00794
值迭代每行的索引
答案 2 :(得分:0)
您可以在循环中区分四种情况:
i%4 == 0
i%4 == 1
i%4 == 2
i%4 == 3
根据这一点,您知道您必须阅读的下一个值的类型。因此,您可以搜索整数,字符串或浮点数,并将值放在正确的位置。
我支持GhostCat的建议只有一个数组和一个包含一行的四个值而不是四个数组的类。