我想创建一个简单的程序,输出输入的任何元素的原子质量。我正在学习我最近开始的Java课程,所以我不知道如何避免使用超过100个变量,每个变量都包含元素原子质量。
另外,如何使用if
语句来使用用户输入的名称(我知道如何存储在字符串中)并将其与其中一个元素匹配,以便输出元素的质量(对应于用于存储多个元素的方法)。
如何压缩此示例代码:
int carbon = 12;
int oxygen = 16;
int hydrogen = 1;
int sulfur = 32;
etc....
答案 0 :(得分:9)
听起来您的第一步是了解地图数据结构。您可以使用它将字符串名称与整数值相关联,然后稍后再查看它们。
Map<String, Integer> elements = new HashMap<String, Integer>();
elements.put("CARBON", 12);
elements.put("OXYGEN", 16);
//etc
然后,如果你有一些输入,你可以查找数字。
String userInput = scanner.next(); // or however you're getting input
Integer atomicWeight = elements.get(userInput.toUpper());
if (atomicWeight == null) //print element not found etc
然后,一旦你完成了程序并且正常工作,你就可以了解适用于从源代码外部加载参考数据的任何技术,无论是文件,数据库还是网络服务等等。
答案 1 :(得分:3)
如果遇到这个问题,我可能会定义一个枚举。
public enum Elements
{
HYDROGEN(1),
...
UNOBTANIUM(666);
public final int atomicWeight;
Elements(int atomicWeight)
{
this.atomicWeight = atomicWeight;
}
}
然后获得正确的元素
String name = ...// from user input
Elements e = Elements.valueOf(name.toUpperCase());
答案 2 :(得分:1)
因为元素的原子质量在应用中的任何一点都不会改变,所以你应该将它们定义为最终:
public class AtomicMass {
public static final int CARBON = 12;
public static final int OXYGEN = 16;
...
}
......或者,您可以使用枚举:
public static enum Element {
carbon(12),
oxygen(16),
hydrogen(1),
sulfur(32);
private int atomicMass;
private Element( int mass ) {
this.atomicMass = mass;
}
}
如果按顺序排序元素(并为0添加UNKNOWN),则甚至不需要显式提供质量。
答案 3 :(得分:1)
我建议使用枚举,正如有人建议的那样,尽管我做的有点不同。地图有很多开销,因为你的数据不是动态的,所以不太合适。原子质量应该是十进制值(double或BigDecimal取决于你使用它的原因),而不是int
public enum AtomicElement {
HYDROGEN(1.00794),
HELIUM(4.002602),
...;
private double atomicMass;
private AtomicElement (double atomicMass) {
this.atomicMass = atomicMass;
}
public int getAtomicNumber() {
return ordinal();
}
public double getAtomicMass() {
return atomicMass;
}
public static AtomicElement forAtomicNumber(int atomicNumber) {
return AtomicElement.values()[atomicNumber];
}
public static AtomicElement forElementName(String elementName) {
return AtomicElement.valueOf(elementName);
}
}
然后你可以按原子序数或元素名称搜索
AtomicElement.forAtomicNumber(2);
AtomicElement.forElementName("CARBON");
但是,假设您将代表整个元素周期表,数据中没有间隙,因为它使用ordinal()值作为原子序数。如果你想要间隙,你必须有一个原子序数的int字段,你的“forAtomicNumber”函数必须循环“values()”以找到具有给定数字的那个。
如果你想要包括已知的同位素等,你甚至可以扩展它......如果你的要求决定了这一点。
答案 4 :(得分:0)
我喜欢将相关数据分组到数组或数组列表中。
String[] elements = new String[# of elements in table];
根据元素的位置,你可以得到原子序数。
然后我会遍历它们以找到任何元素或填充数组。 您可以查看Java Scanner类以获取用户的输入。
答案 5 :(得分:0)
创建一个名为Element
的类,其中包含名称,原子序数等属性。每个元素都对应一个Element
的实例。然后,您可以将所有Elements
放在多个映射中,按名称,原子序数等键入。使用工厂类实例化和初始化映射,并提供查找方法。
答案 6 :(得分:0)
如果我理解正确你只想有一个变量来存储所有元素及其质量,在这种情况下我会推荐一个HashMap。它不会真正节省代码行,但会让你很容易做到2号。 HashMaps存储一组键值对,如果你有键,你可以得到值,这样就可以创建列表:
//Declare a new hashmap and initialize it
HashMap<String, Integer> elements = new HashMap<>();
//Add element information
elements.put("CARBON", 12);
elements.put("OXYGEN", 16);
elements.put("HYDROGEN", 1);
elements.put("SULFUR", 32);
然后例如从对话框中获取用户输入并将结果打印到命令行,您可以执行以下操作:
//Collect user input and convert it to all upper case (in real life you would validate this)
String input = JOptionPane.showInputDialog(null, "Please enter an element name").toUpperCase();
//If element name exists in hashmap print its atomic weight
if(elements.containsKey(input.toUpperCase())){
System.out.println("Atomic Weight: " + elements.get(input));
}
答案 7 :(得分:0)
将数据存储在文件中
Element, Weight
oxygen = 16
carbon, 12
.
.
.
伪代码:
//Read data file into a `Map<String, int>`
//Get user input
//Access map
//Output